Django - 表格无效但没有错误

Pie*_*NAY 12 python django django-forms

模型:

class Session(models.Model):
    tutor = models.ForeignKey(User)
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    def __unicode__(self):
        return u'%s - %s' % (self.tutor, self.start_time)
Run Code Online (Sandbox Code Playgroud)

形成:

class SessionForm(forms.ModelForm):
    class Meta:
        model = Session
        exclude = ['tutor']
Run Code Online (Sandbox Code Playgroud)

测试:

>>> ses = Session.objects.get(pk=1)
>>> ses
<Session: Robert - 2012-03-22 13:00:00>
>>> form = SessionForm(instance=ses)
>>> form.is_valid()
false
>>> form.errors
{}
Run Code Online (Sandbox Code Playgroud)

怎么了 ?

Dan*_*man 18

您尚未将任何数据传递到表单,因此它无效.实例参数不用于设置表单数据,只用于设置初始数据.

  • @PierredeLESPINAY:`form = SessionForm(data=ses)` (2认同)

djv*_*jvg 7

这是为丹尼尔·罗斯曼上面的回答提供一些背景的一个卑微的尝试

\n

正如您在源代码中看到的,BaseForm.is_valid()执行以下操作:

\n
return self.is_bound and not self.errors\n
Run Code Online (Sandbox Code Playgroud)\n

因此,如果is_valid()返回False,即使没有错误,那么也is_bound一定是False

\n

现在, 的值已在( sourceis_bound )中分配:BaseForm.__init__()

\n
self.is_bound = data is not None or files is not None\n
Run Code Online (Sandbox Code Playgroud)\n

表格文档中:

\n
\n

Form 实例要么绑定到一组数据,要么未绑定。

\n
    \n
  • 如果它绑定到一组数据,则它能够验证该数据并将表单呈现为 HTML,并在 HTML 中显示数据。
  • \n
  • 如果它\xe2\x80\x99s未绑定,则无法进行验证(因为\xe2\x80\x99s没有数据可供验证!),但它仍然可以将空白表单呈现为HTML。
  • \n
\n
\n

另请注意,这errors是一个属性,它调用执行实际验证的full_clean()方法(source )。

\n