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来说并不可行在我的帐户模型中。我认为此行为不太理想;我将不得不实施另一个解决方案。无论如何,谢谢。感谢您的解决方案。基本上,这似乎可行,但不适用于外键,因为“用户”在我的帐户模型中。我认为此行为不太理想;我将不得不实施另一个解决方案。无论如何,谢谢。