【问题标题】:Django form errorDjango 表单错误
【发布时间】:2011-01-24 12:01:23
【问题描述】:
class JobForm(forms.ModelForm):
    class Meta:
        model = models.Job

那是我的表单,现在尝试保存它会引发异常,并且尝试验证它只是失败且没有错误......

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

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

【问题讨论】:

  • 很高兴看到发布的工作模型和实际数据

标签: django forms


【解决方案1】:

您的表单绝对不受约束。阅读Bound and Unbound forms

来自该文档:

要将数据绑定到表单,请将数据作为字典作为第一个参数传递给您的Form类构造函数

这意味着模型中字段的更改也不会使表单绑定。您必须通过构造函数显式传递这些值。但是:

请注意,传递空字典会创建一个带有空数据的绑定表单

考虑一下

如果您有一个绑定的 Form 实例并想以某种方式更改数据,或者如果您想将未绑定的 Form 实例绑定到某些数据,请创建另一个 Form 实例 .无法更改 Form 实例中的数据。创建 Form 实例后,您应该考虑其数据不可变,无论它是否有数据。

如果您验证 unbound 表单:

验证没有数据的表单是没有意义的,但是,为了记录,以下是未绑定表单的情况:

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

【讨论】:

  • 我将request.POST 传递给我的表单,并且肯定有数据正在发送。知道为什么这不起作用吗?
  • 为我节省了很多时间,我收到了验证错误,但错误中没有任何内容。这绝对回答了为什么。
【解决方案2】:

我最好的猜测是,您无法保存仅使用实例数据创建的模型表单(我刚刚尝试使用我的一个表单执行此操作并得到完全相同的错误),因为表单不会成为绑定表格,直到您传递额外的信息。仅将模型上已经存在的数据提供给表单(然后再次保存)是没有意义的,因为不会有任何更改。如果这是来自 html 表单,您还应该将 request.POST(或 request.GET)传递给表单。

【讨论】:

  • 文档中有一个示例,它只是检索模型并传递给表单,然后保存表单 docs.djangoproject.com/en/1.1/topics/forms/modelforms/… ,特别是在此评论之后 # 创建表单以编辑现有文章。无论如何,我通过执行 job.state = 'RUNNING' 尝试了您的建议,然后将其传递给表单,但发生了同样的错误。无论如何,我正在使用 urllib2 发送该 POST 请求。
  • 我不确定他们为什么提供这个作为示例(至少保存它),因为它似乎不可能。要保存表单,您需要提供 POST 字典作为第一个参数。为了保存表单,is_bound 和 is_valid() 都应该返回 True。
  • 已更新文档以删除不正确的示例。
猜你喜欢
  • 2012-07-24
  • 1970-01-01
  • 2018-11-24
  • 2012-01-09
  • 2021-09-01
  • 2016-03-20
  • 2011-02-21
  • 2013-12-26
  • 1970-01-01
相关资源
最近更新 更多