表单保存不起作用

时间:2012-01-11 17:08:10

标签: django django-forms

我正在尝试保存一个ModelForm,因为我之前做了一千次,但我没有让它工作。这是我的Test类:

class FooForm(ModelForm):
    class Meta:
        model = Account

现在我简单地得到一个对象并保存它:

a = Account.objects.all()[0]
a.save()

这很有效。现在我想将此对象传递给表单并保存它:

f = FooForm(instance=a)
f.is_valid()

...给出错误。即使没有存储错误:

f.errors
{}
f.non_field_errors()
[]

保存会抛出错误:

f.save()
>>> AttributeError: 'FooForm' object has no attribute 'cleaned_data'

有什么想法吗?

[UPDATE]

关于第二个评论:

f = Form(data={}, instance=a)
f.save()
[....]
ValueError: The Account could not be changed because the data didn't validate.
f.is_valid()
>>> False
f.errors
{'user': [u'This field is required.']}
>>> a.user
<User: demo>

BTW django documentation说,没有数据传递是可以的,然后传递一个实例:

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

......也许有人可以澄清一下downvote吗?我认为这不是一个奇怪的话题。

3 个答案:

答案 0 :(得分:2)

表单构造函数需要data参数(通常为request.POST

<强>更新

你真的想做什么?如果您只想在代码中更改实例,则根本不需要表单。

答案 1 :(得分:1)

没有数据传入的表单永远不会有效,因为没有数据,也没有错误,因为django.forms.BaseForm.full_clean(负责填充cleaned_data的方法,errors如果没有数据,则non_field_errors)实际上并没有做任何事情(is_boundFalse,因为没有datafiles)。

因此,将数据(字典或类字典对象,例如request.POST)作为第一个参数传入表单,然后再次检查is_valid

答案 2 :(得分:1)

ModelForm提供实例仅提供表单的默认值。表单仍然需要POST数据。你没有给它。

基于更新的编辑

通过传递一个空数据集,您基本上将所有内容重置为空。同样,instance仅提供表单在首次呈现时显示的默认值。它对表单保存的最终值没有任何影响。这就是data的用武之地。

尝试:

f = FooForm(data=a.__dict__, instance=a)
f.is_valid()