- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 CBV 的新手,正在寻求重构我的 FBV 的帮助。也许你可以给我看一些例子或建议。如您所见,我对 DRY 原则也有疑问。
我的 FBV:
def formen(request):
html = 'man_index.html'
ip, is_routable = get_client_ip(request)
if request.user.is_authenticated and request.user.sex == 'M':
queryset = Post.objects.filter(sex=request.user.sex, is_published=True)
query = request.GET.get('q')
if query:
queryset = queryset.filter(title__icontains=query)
paginator = Paginator(queryset, 6)
page = request.GET.get('page')
try:
elements = paginator.page(page)
except PageNotAnInteger:
elements = paginator.page(1)
except EmptyPage:
elements = paginator.page(paginator.num_pages)
elements = paginator.get_page(page)
context = {
'all_posts': elements,
'page_range' : paginator.page_range,
}
elif request.user.is_authenticated and request.user.sex == 'W':
return redirect('/forwomen')
else:
queryset = Post.objects.filter(sex='M', is_published=True)
query = request.GET.get('q')
if query:
queryset = queryset.filter(title__icontains=query)
paginator = Paginator(queryset, 3)
page = request.GET.get('page')
try:
elements = paginator.page(page)
except PageNotAnInteger:
elements = paginator.page(1)
except EmptyPage:
elements = paginator.page(paginator.num_pages)
elements = paginator.get_page(page)
context = {
'all_posts': elements,
'page_range' : paginator.page_range,
}
return render(request, html, context)
应该用什么方法重构成CVB?
最佳答案
这看起来像一个 ListView ,因此我们可以编写ListView
[django-doc] 的子类类:
从 django.views.generic.list 导入 ListView
class ForMenView(ListView):
model = Post
template_name = 'man_index.html'
context_object_name = 'all_posts'
paginate_by = 3
def get_queryset(self):
query = request.GET.get('q')
qs = Post.objects.filter(sex='M', is_published=True)
if query:
return qs.filter(title__icontains=query)
return qs
def get_paginate_by(self, queryset):
user = self.request.user
if user.is_authenticated and user.sex == 'M':
return 6
return self.paginate_by
def dispatch(self, request, *args, **kwargs):
user = request.user
if user.is_authenticated and user.sex == 'W':
return redirect('/forwomen') # please replace it with the view <i>name</i>
else:
return super(ArticleListView, self).dispatch(*args, **kwargs)
def get_context_data(self, *args, **kwargs):
kwargs = super(ArticleListView, self).get_context_data(*args, **kwargs)
kwargs['page_range'] = kwargs['paginator'].page_range
return kwargs
但是基于函数的 View 显示了一些奇怪的东西:
paginator.page_range
的引用作为单独的变量是相当奇怪的,因为通过使用对分页器本身的引用,可以访问更多属性。并不是所有的问题都可以用这种基于类的观点来解决,因为我不知道/forwoman
等细节。因此你可以将其视为建议如何进一步重构它。
关于python - 如何将其重构为 CBV django?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52243669/
所以我有一个 CBV (A)、CBV (B) 和一个类似的 url regex=r'^(?P[-\w]+)/(?P[-\w]+)' 我想使用 (A) 读取 slug 和应用程序参数,然后根据这些参数,
我有 Form与 ModelChoiceField ,用作 form_class在 FormView . 必须使用绑定(bind)到 request 的信息填充选择字段。目的。 让我们总结一下: cl
我有两个与 this case 非常相似的模型: class Location(models.Model): city = models.CharField(max_length=20)
我在 forms.py 中创建了两个表单,一个表单的字段比另一个少。 我现在想做的是获取当前用户权限并根据这些权限设置 CBV 的表单类。 以下是我目前的看法: class EditCircuit(U
我是 CBV 的新手,正在寻求重构我的 FBV 的帮助。也许你可以给我看一些例子或建议。如您所见,我对 DRY 原则也有疑问。 我的 FBV: def formen(request): htm
(首先很抱歉我的英语不好) 当用户保存更改时,我试图在 UpdateView 中显示一条消息! 这是我的看法 class NeedUpdateView(UpdateView): model =
在我的 CreateView我正在覆盖 form_valid() 的类功能如下: class ActionCreateView(CreateView): model = Action
我有一个 view我想与自定义 form_class 一起使用: class CustomCreateView(CreateView): form_class = CustomCreateFo
因此,我正在开发一个Web应用程序,该应用程序已在其注册过程中实现了安全性问题。由于我的模型的设置方式以及我试图使用Django的基于类的视图(CBV)的事实,我在将所有内容完全集成在一起时遇到了一些
由于需要检查 M2M 字段的唯一性,建议我编写一个当 m2m 更改时触发的信号。效果很好。 但是,当使用基于类的 View 创建 Badge 对象时,我想捕获此异常并将其转换为表单错误,以便可以以干净
我想检查 View 中对象的状态。如果为 True,则不会发生任何变化,但如果状态不为 True,我想将用户重定向到另一个页面。 以下是我的观点: class ProductDetailView(Lo
我的模型有一个标准的 CBV 更新方法公告: 模型.py: class Announcement(models.Model): title = models.CharField(max_len
我正在尝试测试我的应用。我查看了文档,并设法对我的 URL 和除一个 View 之外的所有 View 进行了测试。 我在将它转换为类 View 时遇到问题,我不确定我应该在这里进行哪种测试?文档解释了
文档功能 nice options for applying decorators such as login_required to Class Based Views . 但是,我不太清楚如何将特
我实现了一个表单,我需要填充用户对象中的字段(名字、姓氏、电子邮件)以及填写新的成员对象。我已经使用基于函数的 View (FBV) 实现了这一点,但我觉得我应该能够使用基于类的 View (CBV)
我无法理解如何使用单个 CBV 来处理(至少)2 个不同的场景。这就是我正在尝试做的事情: 我有一个 ListView 来显示对象列表。从那里,我生成一个链接以导航到 用于显示对象详细信息的 Deta
我在django 1.11中的应用程序,带有django软盘形式,输入电子邮件地址后 - 就可以了,发送邮件。 问题是当没有邮件地址并按“发送”按钮时。 我收到错误: 'ProductDetailVi
我目前正在尝试使用 Django 1.5 进入“基于类的 View ”。 从设计的角度来看,我想知道将处理来自表单的数据的逻辑放在哪里在一个简单的 FormView 中。 我知道所有表单验证代码都进入
我正在学习 Django,我在从 CreateView 重定向回来时遇到问题 我想重定向到 BookDetail 页面,其中包含由 CreateView 创建的 bookinstances 列表。模型
在我的例子中,实例模型可以从以下位置删除: 一个ListView继承View 一个DetailView继承View 默认情况下,调用删除 View 时: get 函数调用“confirm_delete
我是一名优秀的程序员,十分优秀!