0

私はGoogle App Engineを少しいじっていますが、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

誰かが知りたい場合は、ここに完全な答えがあります。@ダニエルが言ったように、フィールド名はオプションではなく選択に由来します。したがって、選択は次のようになります。

<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 に保存されていないオブジェクトを返します。これにより、単一の属性を手動で設定できます。この場合はカテゴリです。Djangoメソッドの詳細については、このリンクを参照してくださいsave()。-メソッドを使用してデータを保存します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 に答える