【问题标题】:GAE: How to use ReferenceProperty in django forms?GAE:如何在 django 表单中使用 ReferenceProperty?
【发布时间】: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


【解决方案1】:

如果有人想知道,这里有完整的答案。就像@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 关键字参数返回一个尚未保存到数据库的对象。这使得手动设置单个属性成为可能。在这种情况下,类别。 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) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2011-07-23
    • 2014-10-17
    • 2012-04-29
    相关资源
    最近更新 更多