首次加载页面时,会加载初始表单值,但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
答案 0 :(得分:1)
这是预期的行为。当您首次加载没有任何GET参数的页面时,表单尚未提交,因此没有任何字段的数据。 None
将传递给表单构造函数,因为request.GET
为空。这意味着您已初始化未绑定的表单。
绑定和未绑定表单之间的区别很重要:
- 未绑定表单没有与之关联的数据。呈现给用户时,它将为空或将包含默认值。
- 绑定表单已提交数据,因此可用于判断该数据是否有效。如果呈现无效的绑定表单,则可以包含内联错误消息,告知用户要更正哪些数据。
在未绑定表单上调用is_valid()
将始终返回False
。
您可能需要修改逻辑以检查表单上的is_bound()
,并使用它来确定表单没有数据时要呈现的内容。