当页面第一次加载时,初始表单值被加载但if form.is_valid()
没有运行(我从一些测试中肯定知道这一点)。为什么?
意见
def view(request):
form = FilterForm(request.GET or None)
question_list = []
if form.is_valid():
if form.cleaned_data['all_questions'] == True:
question_list = Question.objects.all().order_by('date_created')
else:
# create appropriate queryset
形式
class FilterForm(forms.Form):
all_questions = forms.BooleanField(initial=True, required=False)
question_type_a = forms.BooleanField(initial=False, required=False)
question_type_b = forms.BooleanField(initial=False, required=False)
解决方案:
只需要检查is_bound
视图
def view(request):
form = FilterForm(request.GET or None)
question_list = []
if not form.is_bound:
question_list = Question.objects.all().order_by('date_created')
if form.is_valid():
if form.cleaned_data['all_questions'] == True:
question_list = Question.objects.all().order_by('date_created')
else:
# create appropriate queryset
这是预期的行为。当您第一次加载没有任何 GET 参数的页面时,表单尚未提交,因此任何字段都没有数据。None
将传递给表单构造函数,因为它request.GET
是空的。这意味着您已经初始化了一个未绑定的表单。
从文档:
绑定和未绑定表单之间的区别很重要:
- 未绑定的表单没有与之关联的数据。当呈现给用户时,它将为空或包含默认值。
- 绑定表单已提交数据,因此可用于判断该数据是否有效。如果呈现无效的绑定表单,它可以包含内联错误消息,告诉用户要更正哪些数据。
调用is_valid()
未绑定的表单将始终返回False
。
您可能需要修改逻辑以检查is_bound()
表单,并使用它来决定在表单没有数据时呈现什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句