Python GAE:如何在django表单中使用ReferenceProperty?
我在谷歌应用程序引擎上玩了一会儿,但在使用Python GAE:如何在django表单中使用ReferenceProperty?,python,google-app-engine,django-forms,referenceproperty,Python,Google App Engine,Django Forms,Referenceproperty,我在谷歌应用程序引擎上玩了一会儿,但在使用ReferenceProperty处理POST请求时遇到了问题。我正在从现有类别创建一个下拉菜单,如下所示: <select name="mydropdown"> <label for="category">category:</label> {% for c in cats %} <option value={{ c.title }} name="category"> {{ c.t
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>
像这样,我不能用我的POST数据创建表单实例。嗯,我可以创建它,但我选择的类别将不在其中
def post(self):
data = EntryForm(data=self.request.POST)
...
谢谢你的建议。如果有人想知道,这里有完整的答案。就像@Daniel说的,字段名来自选择而不是选项。这就是select的外观:
<select name="category">
<label for="category">category:</label>
{% for c in cats %}
<option>{{ c.title }} </option>
{% endfor %}
</select>
或者将该键用作模板中的选项
名称,如下所示:
<option name="{{ c.key }}">{{ c.title }} </option>
这是我做一个新条目所需要的所有数据。commit=False
关键字参数返回一个尚未保存到数据库的对象。这样就可以手动设置单个属性。在本例中,类别为。要保存数据,请使用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)
我不确定它是否相关,但字段名来自
选择
而不是选项
,因此在HTML中名称是mydropdown
。好了,我们就到了-现在我能够捕获传入的数据,即使我仍然收到一个错误引发数据存储错误。BadKeyError('Invalid string key%s.%encoded'))
。这显然与“ReferenceProperty”有关。现在研究一下……您可能想要{{{c.key}}
作为选项值。实际上,默认情况下您会得到它。通过从EntryForm()
中排除类别并手动设置其值,我解决了问题。在将值添加到Entry()
之前,必须创建Category
的实例。谢谢你一直思考!
<option name="{{ c.key }}">{{ c.title }} </option>
cat_obj = db.get(db.Key(key_name))
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)