【问题标题】:Django Forms Passing Validation Despite Form Errors尽管表单错误,Django 表单仍通过验证
【发布时间】:2015-01-03 08:56:35
【问题描述】:

我想我可能遗漏了一些关于 Django 表单验证的信息,但我认为只有在表单中没有错误时,在表单上运行 is_valid 才会返回 true。

我正在尝试使表单在“endTime”或“duration”未设置时返回 false。

class NewShiftForm(forms.Form):
    recursionChoices = (('1','Once'),('2','Twice'),('4','Four times'),('10','Ten times'))
    endTime = forms.CharField(max_length=16, required=False)
    duration = forms.CharField(max_length=16, required=False)
    employee = UserModelChoiceField(queryset=User.objects.all(), required=True)
    recursion = forms.ChoiceField(choices=recursionChoices, widget=forms.Select())

    def clean(self):
        clean_duration = self.cleaned_data.get("duration")
        clean_endTime = self.cleaned_data.get("endTime")
        if not clean_duration and not clean_endTime:
            raise forms.ValidationError("You need either duration or end time")
        return self.cleaned_data

我认为我的 clean 函数工作正常,因为我在模板中呈现表单时看到了表单错误(“您需要持续时间或结束时间”)。但是,在我看来,我将其设置为检查表单是否通过 is_valid

def newShift(request, year, month, day, hour, minute, positionID):
    form = NewShiftForm()
    validity = "This form did not pass validation"
    if request.POST:
        form = NewShiftForm(request.POST)
        if form.is_valid:
           validity = "This form passed validation" 
    startTime = datetime.datetime(int(year), int(month), int(day), int(hour), int(minute), 0)
    year = int(year)
    position_name = Position.objects.filter(id=positionID)[0]
    return render(request, 'managers/newShift.html',{
        "form": form,
        "start": startTime,
        "position": position_name,
        'validity': validity,
    })

模板在 POST 之前将有效性显示为“此表单未通过验证”。提交,并在 POST 提交后“此表单通过验证”。

如果表单有表单错误,如何使表单无法通过验证?

非常感谢!

【问题讨论】:

    标签: django forms validation


    【解决方案1】:

    你需要

    if form.is_valid():
    

    而不是

    if form.is_valid:
    

    试试这个(简化版):

    def newShift(request, year, month, day, hour, minute, positionID):       
       if request.POST:
          form = NewShiftForm(request.POST)
          if form.is_valid():
             print "This form passed validation"
             return render(request, 'managers/newShift.html',{
                "form": form,
             })
          else:
             print "This form did not pass validation"
             return render(request, 'managers/newShift.html',{
                "form": form,
             })
       else:
          # no POST request
          form = NewShiftForm() # unbound form
          return render(request, 'managers/newShift.html',{
                "form": form,
          })
    

    您可能想根据验证状态更改模板

    【讨论】:

    • 哦,伙计,这当然是一种方法……嗯?非常感谢您的快速回答!并感谢您的结构建议。我显然对此很陌生,并感谢您的指导:)
    • @RobertTownley 是的,我的荣幸!欢迎随时询问您是否需要帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2011-02-01
    • 2016-03-20
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多