首页 > 解决方案 > 表单中的 clean() 方法不起作用(将其加载到 ListView 中)

问题描述

我试过四处搜索并阅读文档,但我不太明白在处理 ListView、get_querysets() 和 get 方法时如何让 clean() 方法工作。

我尝试在 clean() 方法中添加一个断点(),但它没有被触发,这意味着它根本没有被调用。

我的怀疑是因为我没有使用 post 作为表单中的方法,但我需要使用 get 来为查询集构建过滤查询(即,它是使用 from 和 to 的日期选择器)。

这是我的设置(省略细节):

形式:

class ReportForm(forms.Form):
   ...
    def clean(self):
        super().clean()
        ...
        return self.cleaned_data

列表显示:

class ReportView(ListView):
    form_class = ReportForm


    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        form = kwargs.get('form', self.form_class())
        context['form'] = form
        return context
 
    def get_queryset(self):
        # Details omitted but I'm essentially taking data from the form 
        # and using it to filter a QuerySet

        from_date = self.request.GET.get('from_date')
        to_date = self.request.GET.get('to_date')

        .......

        return QuerySet

模板:

   <form action="" method="get">
         {% csrf_token %}
         {% crispy form %}
   </form>

有谁知道为什么我的 clean 方法没有被调用?

标签: djangolistviewdjango-viewsdjango-formsdjango-queryset

解决方案


原来我设置表单变量的方式get_context_data()是错误的。

(我没有将数据绑定到表单)

这解决了我的问题:

form = ReportForm(self.request.GET)

推荐阅读