2010-03-06 42 views
5
class JobForm(forms.ModelForm): 
    class Meta: 
     model = models.Job 

这是我的表,现在试图挽救它会引发异常,并试图验证它只是失败,并没有错误....Django的形状误差

job = get_object_or_404(models.Job, pk=1) 
form = forms.JobForm(instance = job) 
try: 
    form.save() 
except: 
    print sys.exc_info() 

#=>(<type 'exceptions.AttributeError'>, AttributeError("'JobForm' object has no attribute 'cleaned_data'",), <traceback object at 0x1029dbb48>) 

试图验证它:

if form.is_valid(): 
    form.save() 
else: 
    print 'error' 
    print form.errors, len(form.errors) 
#=> 'error' 
#=> 0 

所以表格无效,但没有错误! 有什么想法?

+1

会很高兴看到Job模型和实际发布的数据 – 2010-03-06 20:52:54

回答

18

您的表格绝对不受限制。阅读关于Bound and Unbound forms

从该文档:

将数据绑定到一个形式,通过将数据作为字典第一个参数Form类的构造函数

这意味着模型中字段的更改也不会限制表单。你必须通过构造函数明确地传递这些值。但是:

注意,传递一个空字典创建结合的形式空数据

,并认为这

如果你有一个结合的形式实例,并希望以某种方式改变数据,或者如果你想绑定一个未绑定的表格实例到一些数据,创建另一个F orm实例。无法更改表单实例中的数据。一旦创建了一个Form实例,您应该考虑它的数据不可变的,无论它是否有数据。

如果您验证一个绑定形式:

这是毫无意义的验证表单没有数据,但是,备案,这里的未绑定的形式发生了什么:

>>> f = ContactForm()
>>> f.is_valid()
False
>>> f.errors
{}

+0

我将'request.POST'传递给我的表单,并且确实有数据正在发送。任何想法为什么这不起作用? – CodyBugstein 2014-08-04 13:02:25

+0

为我节省了很多时间,我得到了一个验证错误,但没有发现错误。这绝对是为什么。 – 2015-05-10 18:11:14

3

我最好的猜测是,你不能保存一个只与实例数据创建的模型表单(我只是试图用我的一个表单做这件事,并得到了完全相同的错误),因为表单不会变成一个绑定形式,直到你传递额外的信息。仅仅将模型中已经存在的数据提供给表单(然后再保存)是没有意义的,因为不会有任何改变。如果这是来自html表单,您还应该将request.POST(或request.GET)传递给表单。

+1

该文档有一个示例,它只是检索模型并传递给表单,然后保存表单http://docs.djangoproject.com/en /1.1/topics/forms/modelforms/#the-save-method,特别是在此评论之后#创建一个表单来编辑现有文章。无论如何,我尝试了你在做job.state ='RUNNING'时的建议,然后将它传递给表单,但同样的错误发生了。无论如何,我使用urllib2发送POST请求。 – khelll 2010-03-07 08:20:50

+0

我不确定他们为什么会提供这个例子(至少保存它),因为这看起来不可能。要保存表单,您需要提供POST字典作为第一个参数。为了保存表单,is_bound和is_valid()都应该返回True。 – Adam 2010-03-07 17:34:49

+0

该文档已更新,以删除不正确的示例。 – 2013-02-16 23:08:33