我有一个使用'from google.appengine.ext.db.djangoforms.ModelForm'的帖子处理程序。它将现有实例拉入数据库,然后通过以下方式初始化表单:
myForm = TestForm(instance=self_instance, data=post_data)
我只是将post_data中的三个属性中的一个正确地复制到表单中,但是已经将“self_instance”中已有值的其他两个属性设置为None。这可以避免吗?
谢谢, 理查德
答案 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)
instance
arg,表单将被视为未绑定data
arg,表单将被视为已绑定如果同时提供,data
将覆盖instance
(=>与案例2相同,形式绑定)。
因此,在您的情况下,最好加载self_instance
然后使用data
更新它,然后使用未绑定的表单:
myForm = TestForm(instance=self_instance)