表单中的 clean() 方法不起作用(将其加载到 ListView 中)
clean() method in form not working (loading it into ListView)
我尝试四处搜索并阅读文档,但我不太明白在处理 ListView 的 get_querysets() 和 get 方法时如何使 clean() 方法起作用。
我试过在 clean() 方法中添加一个断点 (),但它没有被触发,这意味着它根本没有被调用。
我怀疑是因为我没有使用 post 作为表单中的方法,但我需要使用 get 来为查询集构建过滤器查询(即,它是一个日期选择器,使用从和到)。
这是我的设置(省略细节):
表格:
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 方法没有被调用?
原来我在 get_context_data()
中设置表单变量的方式是错误的。
(我没有绑定数据到表格)
这解决了我的问题:
form = ReportForm(self.request.GET)
我尝试四处搜索并阅读文档,但我不太明白在处理 ListView 的 get_querysets() 和 get 方法时如何使 clean() 方法起作用。
我试过在 clean() 方法中添加一个断点 (),但它没有被触发,这意味着它根本没有被调用。
我怀疑是因为我没有使用 post 作为表单中的方法,但我需要使用 get 来为查询集构建过滤器查询(即,它是一个日期选择器,使用从和到)。
这是我的设置(省略细节):
表格:
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 方法没有被调用?
原来我在 get_context_data()
中设置表单变量的方式是错误的。
(我没有绑定数据到表格)
这解决了我的问题:
form = ReportForm(self.request.GET)