2011-05-05 61 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)