form.is_valid()在第一次访问时没有运行?

时间:2017-12-02 04:04:11

标签: django

首次加载页面时,会加载初始表单值,但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

1 个答案:

答案 0 :(得分:1)

这是预期的行为。当您首次加载没有任何GET参数的页面时,表单尚未提交,因此没有任何字段的数据。 None将传递给表单构造函数,因为request.GET为空。这意味着您已初始化未绑定的表单。

来自documentation

  

绑定和未绑定表单之间的区别很重要:

     
      
  • 未绑定表单没有与之关联的数据。呈现给用户时,它将为空或将包含默认值。
  •   
  • 绑定表单已提交数据,因此可用于判断该数据是否有效。如果呈现无效的绑定表单,则可以包含内联错误消息,告知用户要更正哪些数据。
  •   

在未绑定表单上调用is_valid()将始终返回False

您可能需要修改逻辑以检查表单上的is_bound(),并使用它来确定表单没有数据时要呈现的内容。