【问题标题】:Is this an error in the documentation?这是文档中的错误吗?
【发布时间】:2012-10-05 16:53:16
【问题描述】:

今天我开始阅读django.forms 的文档。该 API 似乎很容易使用,我开始尝试使用它。然后我开始尝试django.forms.ModelForm,但我真的看不出哪里出错了。

我的问题从这里开始:the save method 在创建带有instanceform 时。

我的模特是

class Process(models.Model):
    key         = models.CharField(max_length=32, default="")
    name        = models.CharField(max_length=30)
    path        = models.CharField(max_length=215)
    author      = models.CharField(max_length=100)
    canparse    = models.NullBooleanField(default=False)
    last_exec   = models.DateTimeField(null = True)
    last_stop   = models.DateTimeField(null = True)
    last_change = models.DateTimeField(null = True, auto_now=True)

我的表格是

class ProcessForm(ModelForm):
    class Meta:
        model  = Process
        fields = ('name', 'path', 'author')

我只想要namepathauthor 字段,因为保存模型时会自动设置其他字段。无论如何,在我的测试数据库中,我已经有条目,并且我选择了一个其字段全部已设置且有效的条目。

在您可以阅读的文档中:

# Create a form to edit an existing Article.
>>> a = Article.objects.get(pk=1)
>>> f = ArticleForm(instance=a)
>>> f.save()

很好,我想用我自己的代码做同样的事情:

>>> from remusdb.models import Process
>>> from monitor.forms import ProcessForm
>>> 
>>> proc = Process.objects.get(name="christ")
>>> pf = ProcessForm(instance=proc)
>>> pf.save()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/shaoran/devpython/lib/python2.6/site-packages/django/forms/models.py", line 364, in save
    fail_message, commit, construct=False)
  File "/home/shaoran/devpython/lib/python2.6/site-packages/django/forms/models.py", line 87, in save_instance
    save_m2m()
  File "/home/shaoran/devpython/lib/python2.6/site-packages/django/forms/models.py", line 78, in save_m2m
    cleaned_data = form.cleaned_data
AttributeError: 'ProcessForm' object has no attribute 'cleaned_data'
>>> pf.is_bound
False
>>> pf.is_valid()
False

尽管proc 是一个有效的Process 对象,但表单对象似乎并不同意我的看法。如果我像下一个例子那样做

>>> post = { "name": "blabla", "path": "/somewhere", "author": "me" }
>>> pf = ProcessForm(post, instance=proc)
>>> pf.is_bound
True
>>> pf.is_valid()
True
>>> pf.cleaned_data
{'path': u'/somewhere', 'name': u'blabla', 'author': u'me'}

然后它就像文档的第三个示例一样工作。

是我遗漏了什么还是文档中有错误?还是我的Model 代码有些错误?

这是proc的内容

proc.dict {'name': u'christ', 'last_stop': datetime.datetime(2012, 10, 5, 16, 49, 13, 630040, tzinfo=), 'author': u'unkown', '_state': , 'canparse': False, 'last_exec': datetime.datetime(2012, 10, 5, 16, 49, 8, 545626, tzinfo=), 'key': u'aed72c9d46d2318b99ffba930a110610', 'path': u'/home/ shaoran/projects/cascade/remusdb/test/samples/christ.cnf', 'last_change': datetime.datetime(2012, 10, 5, 16, 49, 13, 631764, tzinfo=), 'id': 5}

【问题讨论】:

  • 你能写出你得到的 proc 中的内容吗(也许 proc.__dict__ 返回的内容)?
  • @jasisz:我已经用proc.__dict__的内容更新了我原来的帖子
  • 你使用的是什么版本的 Django?
  • 这可能会有所帮助stackoverflow.com/a/2394120/991546
  • 是的,这很有帮助。我今天阅读了很多文档,但似乎我应该更多地阅读“精美印刷”。

标签: django


【解决方案1】:

表单类的第一个参数是一个字典,其中包含您希望表单验证的值。

由于您从未传入这些值,因此表单无法验证任何输入;这就是为什么cleaned_data 没有。由于.save()触发了表单模型校验,表单校验失败。

您会注意到表单实际上没有数据:

af.data 将是 {}(空字典) af.is_bound 将是 False(因为您还没有将表单绑定到任何数据)

由于没有数据,验证失败。该错误有点误导。如果你传入一个空字典:

af = ArticleForm({},instance=a)
af.save()

你会得到一个更合适的错误:

ValueError: The Article could not be changed because the data didn't validate.

【讨论】:

    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2011-09-28
    • 2017-07-23
    相关资源
    最近更新 更多