在Google appengine上用django初始化一个表单



我有一个post处理程序,使用'from google.appengine.ext.db.djangoforms.ModelForm'。它从数据库中提取现有实例,然后通过以下方式初始化表单:

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

我只把三个属性中的一个放在post_data中,这是正确复制到表单的,但其他两个已经在"self_instance"中有值的属性被设置为None。这种情况可以避免吗?

谢谢,理查德。

这给了我我所追求的行为:

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. 如果您提供instance参数,则认为表单未绑定
  2. 如果您提供data参数,则表单被认为是绑定的

如果两者都提供,data将覆盖instance(=>与情况2相同,表单绑定)。

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

myForm = TestForm(instance=self_instance)

没有显示表单定义。但是,一般来说,如果你不想在表单中包含字段,你应该在Meta exclude元组中指定它们——这样它们就不会被不存在的POST数据覆盖。

最新更新