型号:
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)
形式:
class SessionForm(forms.ModelForm):
class Meta:
model = Session
exclude = ['tutor']
测试:
>>> 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
{}
怎么了?
答案 0 :(得分:17)
您尚未将任何数据传递给表单,因此无效。实例参数不用于设置表单数据,只用于设置初始数据。
答案 1 :(得分:0)
这是为Daniel Roseman's answer above提供一些背景的谦虚尝试。
在source中可以看到,BaseForm.is_valid()
执行以下操作:
return self.is_bound and not self.errors
因此,如果is_valid()
返回False
,即使没有错误,is_bound
也必须是False
。
现在,is_bound
的值已在BaseForm.__init__()
(source)中分配:
self.is_bound = data is not None or files is not None
Form实例绑定到一组数据,或者未绑定。
- 如果它绑定到一组数据,则可以验证该数据并将表单显示为HTML,并在HTML中显示数据。
- 如果未绑定,它将无法进行验证(因为没有要验证的数据!),但仍可以将空白表单呈现为HTML。
还要注意,errors
是一个属性,它调用full_clean()
方法(source),该方法进行实际的验证。