我正在尝试保存一个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吗?我认为这不是一个奇怪的话题。
答案 0 :(得分:2)
表单构造函数需要data
参数(通常为request.POST
)
<强>更新强>
你真的想做什么?如果您只想在代码中更改实例,则根本不需要表单。答案 1 :(得分:1)
没有数据传入的表单永远不会有效,因为没有数据,也没有错误,因为django.forms.BaseForm.full_clean
(负责填充cleaned_data
的方法,errors
如果没有数据,则non_field_errors
)实际上并没有做任何事情(is_bound
为False
,因为没有data
或files
)。
因此,将数据(字典或类字典对象,例如request.POST
)作为第一个参数传入表单,然后再次检查is_valid
。
答案 2 :(得分:1)
向ModelForm
提供实例仅提供表单的默认值。表单仍然需要POST数据。你没有给它。
基于更新的编辑:
通过传递一个空数据集,您基本上将所有内容重置为空。同样,instance
仅提供表单在首次呈现时显示的默认值。它对表单保存的最终值没有任何影响。这就是data
的用武之地。
尝试:
f = FooForm(data=a.__dict__, instance=a)
f.is_valid()