GAE:如何在django表单中使用ReferenceProperty?

时间:2013-03-15 09:24:58

标签: 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.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)
...

感谢您的任何建议。

1 个答案:

答案 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) 
相关问题