【发布时间】:2013-03-15 09:24:57
【问题描述】:
我正在使用谷歌应用引擎,但在使用ReferenceProperty 处理 POST 请求时遇到了困难。我正在从现有类别中创建一个下拉菜单,如下所示:
<select name="mydropdown">
<label for="category">category:</label>
{% for c in cats %}
<option value={{ c.title }} name="category"> {{ c.title }} </option>
{% endfor %}
</select>
表单有更多字段:
<div>
<label for="title">Title:</label>
{{ e_form.title }}
</div>
....
选项值需要是{{ e_form }} 的一部分,在本例中为{{ e_form.category }。如何建立这样的交叉引用?或者对于我的问题有什么不同的好解决方案?
看看我的模型(class CatForm() 在别处使用):
class Category(db.Model):
title = db.StringProperty()
slug = db.StringProperty()
description = db.StringProperty(multiline=True)
class CatForm(djangoforms.ModelForm):
class Meta:
model = Category
exclude = ['slug']
class Entry(db.Model):
category = db.ReferenceProperty(Category)
author = db.UserProperty()
title = db.StringProperty(required=True)
slug = db.StringProperty(required=True)
body = db.TextProperty(required=True)
published = db.DateTimeProperty(auto_now_add=True)
updated = db.DateTimeProperty(auto_now=True)
class EntryForm(djangoforms.ModelForm):
class Meta:
model = Entry
exclude = ['published','updated']
像这样,我无法使用我的 POST 数据创建表单实例。好吧,我可以创建它,但我选择的类别不会在那里。
def post(self):
data = EntryForm(data=self.request.POST)
...
感谢您的建议。
【问题讨论】:
-
我不确定它是否相关,但字段名称来自
select而不是option,因此在您的 HTML 中名称是mydropdown。 -
好的,我们到了 - 现在我能够捕获传入的数据,即使我仍然收到错误
raise datastore_errors.BadKeyError('Invalid string key %s.' % encoded)。这显然与`ReferenceProperty`有关。现在正在调查... -
您可能希望
{{ c.key }}作为选项值。 -
其实你是默认得到的。我通过从
EntryForm()中排除类别并手动设置它的值来解决我的问题。您必须先创建Category的实例,然后才能将值添加到Entry()。感谢您的思考!
标签: python google-app-engine django-forms referenceproperty