2014-05-05 68 views
0

我對模型ModelA(我正在使用這些在FormView中)使用django模型表單MyModelFormADjango通過模型中的對象傳遞初始值

我想通過使用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對象,而不是創建新。

  1. HTTP請求無狀態的,如何要求知道被在以前的請求

  2. 順利通過處理一個instance如何解決這個問題?

我認爲做這樣的事情

def get_initial(self): 
    initial = model_to_dict(MyModelAObject) 
    return initial 

的其實只有一個在MyModelFormAMyModelA領域的子集。最初以字典形式傳遞所有字段不會造成任何麻煩?

有沒有很多優雅的方式來處理它?

+0

你怎麼'ModelAObject'? – Rohan

+0

我從數據庫中得到它! 'ModelA.objects.get()' – Iamcool

+0

但是,你如何得到一些特定的對象? – Rohan

回答

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()會工作。

+0

如果表單將pk值作爲隱藏字段傳遞給模板,是不是創建安全循環漏洞?例如,用戶可以去編輯pk值,並使表單相信它來自錯誤的對象! – Iamcool

1
  1. 當您通過的ModelForm實例,它設置該實例作爲初始形式的id字段爲好。因此,如果它在POST中收到一個ID,它會將其視爲一個現有對象並更新它。

  2. 您需要傳遞單個字段的初始值(即id除外)。 最好的方法是在ModelForm中只傳遞字段作爲初始值。

def get_initial(self): 
    return { 
     'a': MyModelAObject.a, 
     .... 
    }