[英]Django pass initial values from object in Model Form
我为模型ModelA
有Django模型表单MyModelFormA
(我在FormView
使用它们)。
我想使用ModelA
现有对象将初始值传递给表单,并在发生更改时ModelA
创建新对象。
我一直在传递初始值,如下所示:
def get_form_kwargs(self):
kwargs = super(MyFormView, self).get_form_kwargs()
kwargs.update({'instance': ModelAObject})
我不知道为什么,但是何时验证表单,如下所示
def form_valid(self, form):
instance = form.save()
它只是更新现有的instance
对象,而不是创建新的instance
对象。
HTTP请求是无状态的,该请求如何知道在先前请求中正在处理的正在传递的instance
如何解决呢?
我想到做类似的事情
def get_initial(self):
initial = model_to_dict(MyModelAObject)
return initial
实际上,在MyModelFormA
中只有MyModelA
字段的子集。 最初将所有字段作为dict传递,不会造成任何麻烦吗?
有什么优雅的处理方式吗?
当您传递ModelForm实例时 ,它还将该实例的id字段也设置为表单的首字母。 因此,如果它在POST中收到ID,则将其视为现有对象并对其进行更新
您将需要传递各个字段的初始值(即ID除外)。 最好的方法是仅在ModelForm中传递初始所需的字段 。
def get_initial(self): return { 'a': MyModelAObject.a, .... }
可能您可以尝试以下方法:
def form_valid(self, form):
if form.has_changed()
instance = form.save(commit=False)
instance.pk = None
#if you have id
instance.id = None
instance.save() #will give you new instance.
检查在Django 1.4中,未记录的Form.has_changed()和Form.changed_data是否按预期工作? 看看form.has_changed()
如何工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.