我有一个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)
- 如果您提供
instance
参数,则认为表单未绑定 - 如果您提供
data
参数,则表单被认为是绑定的
如果两者都提供,data
将覆盖instance
(=>与情况2相同,表单绑定)。
因此,在您的情况下,最好先加载self_instance
然后更新为data
然后使用未绑定表单:
myForm = TestForm(instance=self_instance)
没有显示表单定义。但是,一般来说,如果你不想在表单中包含字段,你应该在Meta exclude
元组中指定它们——这样它们就不会被不存在的POST数据覆盖。