我正在使用谷歌应用引擎,但使用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)
...
感谢您的任何建议。
答案 0 :(得分:0)
如果有人想知道,这里有完整的答案。就像@Daniel所说,字段名称来自select而不是选项。所以这就是选择的样子:
<select name="category">
<label for="category">category:</label>
{% for c in cats %}
<option>{{ c.title }} </option>
{% endfor %}
</select>
您可以使用类别标题
创建父类的实例c = self.request.get("category")
cat_get = Category.all().filter("title =", c).get()
或在模板中使用密钥作为option
名称,如下所示:
<option name="{{ c.key }}">{{ c.title }} </option>
然后您可以直接使用该键来获取Category
对象。
cat_obj = db.get(db.Key(key_name))
这是我创建新条目所需的所有数据。 commit=False
关键字参数返回尚未保存到DB的对象。这样就可以手动设置单个属性。在这种情况下的类别。 See This link for details on the Django save()
-method。要保存数据,请使用put()
- 方法。
new_entry = form_data.save(commit=False)
new_entry.category = cat_get
new_entry.put()
把所有碎片放在一起处理程序看起来像这样。
class NewEntry(webapp.RequestHandler):
def post(self):
form_data = EntryForm(self.request.POST)
if form_data.is_valid():
c = self.request.get("category")
cat_get = Category.all().filter("title =", c).get()
new_entry = form_data.save(commit=False)
new_entry.category = cat_get
new_entry.put()
self.redirect("/main" )
else:
self.response.set_status(500)