Django 表单保存不起作用

Django 表单保存不起作用,django,django-forms,Django,Django Forms,我正试图像以前一样保存一个模型表单,但是我无法让它工作。这是我的测试课: class FooForm(ModelForm): class Meta: model = Account 现在我简单地获取一个对象并保存它: a = Account.objects.all()[0] a.save() f = FooForm(instance=a) f.is_valid() 这很有效。现在,我想将此对象传递到表单并保存它: a = Account.objects.all()[

我正试图像以前一样保存一个模型表单,但是我无法让它工作。这是我的测试课:

class FooForm(ModelForm):
    class Meta:
        model = Account
现在我简单地获取一个对象并保存它:

a = Account.objects.all()[0]
a.save()
f = FooForm(instance=a)
f.is_valid()
这很有效。现在,我想将此对象传递到表单并保存它:

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'
有什么想法吗

[更新]

关于second的评论:

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>

。。。还有谁能澄清否决票?我认为这不是一个奇怪的话题。

表单构造函数需要一个
数据
参数(通常是
请求.POST

更新


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

表单构造函数需要一个
数据
参数(通常是
请求.POST

更新


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

没有传入数据的表单永远无效,因为没有数据,它也没有错误,因为
django.forms.BaseForm.full_clean
(如果没有数据,负责填充
cleaned_data
errors
non_field_errors
)的方法实际上不会做任何事情(
是绑定的
,因为没有
数据
文件


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

没有传入数据的表单永远无效,因为没有数据,它也没有错误,因为
django.forms.BaseForm.full\u clean
(负责填充
已清理的\u数据
错误
非\u字段\u错误
)的方法实际上不会在没有数据的情况下执行任何操作(
是绑定的
假的
,因为没有
数据
文件


因此,将数据(字典或类似字典的对象,例如
request.POST
)作为第一个参数传递到表单中,然后再次检查
是否有效

ModelForm
提供实例只会为表单提供默认值。表单仍然需要POST数据。您没有给它任何值

根据更新进行编辑

通过传递一个空的数据集,实际上您已经将所有内容重置为空。同样,
实例
仅提供表单首次呈现时显示的默认值。它对表单将保存的最终值没有任何影响。这就是
数据
的作用

尝试:


ModelForm
提供实例只会为表单提供默认值。表单仍然需要POST数据。您没有给它任何值

根据更新进行编辑

通过传递一个空的数据集,实际上您已经将所有内容重置为空。同样,
实例
仅提供表单首次呈现时显示的默认值。它对表单将保存的最终值没有任何影响。这就是
数据
的作用

尝试:


现在,您的错误应该可以自圆其说了。
user
字段是必需的,因此您必须传入一个用户(id)。那么,正如文档所示,我不理解传递实例的选项,因为实例具有“user”附加。关于您的评论:这是一个测试设置。实际上,我想使用表单中已经存在的大量数据和自定义验证执行对象更新。传递实例将字段(呈现到页面上时)的初始值设置为当前在模型上设置的值。我认为
form.save()
在文档中是文档本身的一个错误;好吧,这不应该起作用。只是一个旁注-如果您要转换复杂的“正常”从表单到模型表单,我发现这通常不值得付出努力。只需编写额外的代码,直接从非模型表单的.cleaned_数据修改实例。现在您的错误应该可以说明问题了。
user
字段是必需的,因此您必须传入一个用户(id)那么,正如文档所示,我不理解传递实例的选项,因为实例有“user”附加。关于您的评论:这是一个测试设置。实际上,我想使用表单中已经存在的大量数据和自定义验证执行对象更新。传递实例将字段(呈现到页面上时)的初始值设置为当前在模型上设置的值。我认为
form.save()
在文档中是文档本身的一个错误;好吧,这不应该起作用。只是一个旁注-如果您要转换复杂的“正常”从表单到模型表单,我发现这通常不值得付出努力。只需编写额外的代码,直接从非模型表单的.cleaned_数据修改实例。感谢您的解决方案。基本上,这似乎是可行的,但对于作为“用户”的ForeignKeys来说并不可行在我的帐户模型中。我认为此行为不太理想;我将不得不实施另一个解决方案。无论如何,谢谢。感谢您的解决方案。基本上,这似乎可行,但不适用于外键,因为“用户”在我的帐户模型中。我认为此行为不太理想;我将不得不实施另一个解决方案。无论如何,谢谢。