我为模型MyModelFormA
设置了django模型ModelA
(我在FormView
中使用了这些)。
我想使用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
对象,而不是创建新的。
HTTP请求是无状态的,请求如何知道在先前请求中处理的instance
如何解决这个问题?
我想做像
这样的事情def get_initial(self):
initial = model_to_dict(MyModelAObject)
return initial
实际上MyModelA
中只有MyModelFormA
个字段的子集。最初将所有字段作为字典传递,不会造成任何麻烦吗?
是否有任何优雅的方式来处理它?</ p>
答案 0 :(得分:1)
当您传递 ModelForm一个实例时,它会将该实例的id字段设置为表单的首字母。因此,如果它在POST中收到一个ID,它会将其视为现有对象并进行更新
您需要传递单个字段的初始值(即id除外)。 最佳方式是仅将ModelForm中的字段作为初始值传递。
def get_initial(self): return { 'a': MyModelAObject.a, .... }
答案 1 :(得分:0)
可能你可以试试这个:
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.
选中In Django 1.4, do Form.has_changed() and Form.changed_data, which are undocumented, work as expected?,了解form.has_changed()
的工作原理。