0

我正在玩弄谷歌应用引擎,但在处理 POST 请求时遇到了问题ReferenceProperty。我正在从现有类别中创建一个下拉菜单,如下所示:

<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)
...

感谢您的任何建议。

4

1 回答 1

0

如果有人想知道,这里是完整的答案。就像@Daniel 所说,字段名称来自选择而不是选项。所以这就是选择的样子:

<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>

然后就可以直接使用key来获取Category对象了。

    cat_obj = db.get(db.Key(key_name))

这是我创建新条目所需的所有数据。commit=False关键字参数返回一个尚未保存到数据库的对象。这使得手动设置单个属性成为可能。在这种情况下,类别。有关 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) 
于 2013-03-18T15:38:36.457 回答