[英]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.