使用谷歌appengine上的django初始化带有数据的表单

时间:2011-05-05 08:51:27

标签: python django google-app-engine

我有一个使用'from google.appengine.ext.db.djangoforms.ModelForm'的帖子处理程序。它将现有实例拉入数据库,然后通过以下方式初始化表单:

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

我只是将post_data中的三个属性中的一个正确地复制到表单中,但是已经将“self_instance”中已有值的其他两个属性设置为None。这可以避免吗?

谢谢, 理查德

3 个答案:

答案 0 :(得分: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)  

答案 1 :(得分:1)

您不会显示表单定义。但是,通常,如果您不想在表单中包含字段,则应在Meta exclude元组中指定它们 - 然后它们不会被不存在的POST数据覆盖。

答案 2 :(得分:1)

  1. 如果您提供instance arg,表单将被视为未绑定
  2. 如果您提供data arg,表单将被视为已绑定
  3. 如果同时提供,data将覆盖instance(=>与案例2相同,形式绑定)。

    因此,在您的情况下,最好加载self_instance然后使用data更新它,然后使用未绑定的表单:

    myForm = TestForm(instance=self_instance)