2011-05-05 63 views
2

我有一個使用'from google.appengine.ext.db.djangoforms.ModelForm'的文章處理程序。它拉動現有實例,然後數據庫通過初始化形式:使用django在谷歌appengine初始化一個表單

myForm = TestForm(instance=self_instance, data=post_data) 

我只投入了post_data三個屬性正在被正確地複製到形式,但是也已經有另外兩個屬性之一'self_instance'中的值被設置爲None。這可以避免嗎?

感謝, 理查德

回答

1
  1. 如果提供instance精氨酸,形式被認爲是未結合的
  2. 如果提供data精氨酸,形式被認爲是結合

如果提供兩個,data將覆蓋instance(=>相同作爲案例2,形式綁定)。

所以你的情況,這是更好地加載self_instance然後用data更新,然後使用未綁定的形式:

myForm = TestForm(instance=self_instance) 
+0

感謝澄清。有沒有簡單的方法來更新數據? – 2011-05-05 09:55:20

1

你不顯示您的表單定義。但是,通常,如果您不想在表單中包含字段,則應該在Meta exclude元組中指定它們 - 然後它們將不會被不存在的POST數據覆蓋。

+0

謝謝你的回答,對不起,如果我沒有澄清這個問題。我不想排除任何字段,我從一個胖客戶端發佈,但它只是三個參數中的一個。默認行爲似乎將其他設置設置爲None,但我想記住其他兩個字段中存在的實例值。 – 2011-05-05 09:57:21

2

這是給我的行爲,我以後:

if self_instance: 
    logging.info('creating form with instance so updating the post data, we need this to bind the form so we can validate it') 
    if post_data: 
    #update the post data with existing values 
    for prop in self_instance._properties: 
     if prop not in post_data: 
     cur_prop_val = getattr(self_instance, prop) 
     if isinstance(cur_prop_val,db.Model): 
      str(cur_prop_val.key()) 
     else: 
      post_data[prop] = cur_prop_val 
    else: 
    logging.info('no post data so not adding it to form') 
    form_data = form_class(data=post_data,instance=self_instance) 
else: 
    logging.info('creating form without instance') 
    form_data = form_class(data=post_data)