0

假设我有一个包含条目的博客,我想按类别或日期进行过滤:对于过滤器,我使用以下表格

#forms.py

class MyForm(forms.Form):
    categories = forms.ModelMultipleChoiceField(Category.objects.all(),
                                                required=False)
    start_date = forms.DateField(required=False)
    end_date = forms.DateField(required=False)

我有以下观点:

#views.py

blog_entries = Blog.objects.all()
cat_filter = TurnoverFilterForm(request.GET)
    if cat_filter.is_valid():
        categories_chosen = cat_filter.cleaned_data['categories']
        start_date = cat_filter.cleaned_data['start_date']
        end_date = cat_filter.cleaned_data['end_date']
        blog_entries = blog_entries.cat_filter(categories_chosen).date_filter(start_date,end_date)
return render(request,'index.html',{'blog_entries':blog_entries}

自定义管理器功能在哪里date_filter以及在哪里(哪些工作)。cat_filter

问题是:

  1. 我真的需要将表单中的每个字段设为可选吗?这些情况是否有任何可选表格?(因为有很多代码冗余)
  2. 我的表单中有一个丑陋的 if 语句,因为表单始终有效(或者至少应该是类别,日期范围是可选的,并且表单的请求类型是“获取”
  3. 对于此类问题,还有其他优雅的解决方案吗?我可以想象这真的很常见
4

1 回答 1

2

如果您希望表单中的所有字段都是可选的,您可以__init__像这样覆盖表单的功能:

def __init__(self, *args, **kwargs):
    super(forms.Form, self).__init__(*args, **kwargs)
    for f in self.fields:
        self.fields[f].required=False

这样,您将所有字段的必填字段设置为 False 并避免代码冗余以使整个表单变为可选。

Likeis_valid方法将True始终返回,您可以将其从代码中删除,并将另一个函数添加到表单中,该函数将剩余代码封装在views.py.

有了这个,你可以简化一点代码。如果您想要一些更高级的想法,请考虑将 Form 类子类化并创建OptionalForm,这样您就可以使该代码可重用。

于 2013-04-29T02:37:01.353 回答