1

ユーザーのお気に入りの果物をデータベースから照会して次のように表示するフォームを作成したいと思います。

<select size="4"> 
<option selected>Apples</option>
<option>Bananas</option> 
<option>Oranges</option>
<option>Watermelon</option> 
</select>

フォームを使用するビューは次のようになります。

  1. ユーザーオブジェクトを取得します。
  2. ユーザーのお気に入りの果物をデータベースに照会します。(それぞれがFruitモデルの個別のオブジェクトです。)
  3. (2)で収集した果物の選択肢をフォームにロードします。

ChoiceFieldの使用を検討していましたが、少なくとも簡単な方法で、選択肢のリストをフォームに動的にロードできないようです。フォームをスキップして、テンプレートで直接コードを生成する方がよいでしょうか?または、ビューのユーザーアイテムを使用してフォームのChoiceFieldをロードする方法はありますか?

また、テンプレートでフォームコードを生成するよりも、djangoフォームフィールドを使用してフォームを作成する方が簡単な経験則はありますか?

4

3 に答える 3

5

私はこのスタックオーバーフローのトピックで答えを見つけました。秘訣は、フォームをオーバーライドし__init__()て、新しいキーワード引数(この場合はユーザー)を受け入れるようにすることです。

views.pyスニペット

context = RequestContext(request)
user = User.objects.get(username=context['user'])
form = forms.FruitForm(user=user)

forms.pyスニペット

from django import forms

class FruitForm(forms.Form):
    fruits = forms.ModelChoiceField(queryset=Fruit.objects.all())

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(FruitForm, self).__init__(*args, **kwargs)
        if user:
            self.fields['fruits'].queryset = Fruit.objects.filter(user=user)
于 2012-06-17T14:37:06.630 に答える
0

それほど難しいことではありません。これは、モデルフォームを使用して簡単に実行できます。

参照:https ://docs.djangoproject.com/en/dev/topics/forms/modelforms/

Djangoフレームワークの強みの1つは、フォームの処理と検証の方法です。したがって、可能であれば、Djangoフォームまたはモデルフォームを使用することをお勧めします。

于 2012-06-16T05:42:03.990 に答える
0

ビューで使用されるフォームまたはModelFormを作成します。2つのクラスの違いは、がカスタム属性を持つことができるファイルでModelForm定義されたデータベースモデルに非常に似ているように構築されていることです。models.pyForm

from django.forms import ModelForm
class FruitForm(ModelForm):
    class Meta:
        model = User
        fields = ('favorite-fruits', )
于 2012-06-16T06:14:46.277 に答える