2011-11-12 14 views
4

私はフォームウィザードを構築しています。最初のステップでは、1つのフィールドを持つフォームがあります。そのフィールドは外部キーです。外部キーのDjangoのデフォルトのウィジェットは、ドロップダウン(選択)メニューにフィールドのオプションを与え、各オプションをhtmlオプションとしてrepresenetsします。私はデフォルトのウィジェットをRadioSelectに変更しました。それで、ラジオボタンを使ってフィールドのオプションを私に与えます。djangoフォームでは、フィールドごとに個別のオプションをループするにはどうすればよいですか?

はここで私は何をしたいのは、各オプションをループすることができ、私はモデルに保存するオプションごとに固有のデータを取得している私のforms.py

class ChooseProductTypeForm(ModelForm): 
    class Meta: 
     model = Product 
     widgets = { 
      'type': RadioSelect, 
     } 

です。

私はそれはのような単純なものでしょう期待していた:私はコミュニティが言っているものを見ることにしました一日半の研究の後

{% for field in form %} 
    {% for option in field %} 
     {{ option.image }} 
     {{ option.title }} 
     {{ option.description }} 
    {% endfor %} 
{% endfor %} 

。 FWIW、私は動作するいくつかのソリューションを見つけましたが、非常に複雑です。より簡単な方法が必要でしょうか?

答えて

7

クエリーセットの選択肢にアクセスできますが、テンプレートはおそらくこの種のロジックにとって適切な場所ではないことに注意してください。 NB field.fieldタイプミス

{% for field in form %} 
    {% for option in field.field.choices.queryset %} 
     {{ option.image }} 
     {{ option.title }} 
     {{ option.description }} 
    {% endfor %} 
{% endfor %} 
+0

これは質問に答えるものです。テンプレートはそのロジックの場所ではありません。ありがとう:) – teewuane

0

申し訳ありませんが、フィールドはあなたが望むように反復可能ではありません。反復しようとしていることはクエリーセットではありません。それはModelChoiceFieldです。個々の選択肢にアクセスすることはできますが、最初の要素として外部キーのIDを使用し、2番目の要素として__unicode__という表現を2つのタプルとして内部的に表現しています。

あなたが言ったように、しかし、この問題を処理する方法があります。最悪の場合でも、モデルIDをキーにして必要な情報を辞書に送ることが最善の方法です。 values querysetを使用すると、これを簡単に行うことができます。

0

されていない私は、これは二つの方法で行われて見ることができます。

各オプションモデルの属性をレンダリングするカスタムウィジェットをこのフィールドに作成できます。これは非常に可能ですが、私はすぐにすべてを書き込む時間がありません。

別の、より速い方法はこれを処理し、フォーム内の関数を追加し、必要なデータを返している

class ChooseProductTypeForm(ModelForm): 
    def get_my_modelfield(self): 
     for option in self.fields['my_modelfield'].queryset: 
      yield { 
       'image': option.image, 
       'title': option.title, 
       'description': option.description 
      } 

これは主に、テンプレートのうち、データベースを保持し、単に簡単にフォローを使用していますあなたが必要とするデータを返すフォーム関数。フォームフィールドが変更された場合、この機能を更新するのではなく、テンプレートを調整する必要はなくなりました。

これの欠点は、フォームのフィールドをループすることができず、それぞれのフィールドを明示的に出力する必要があることです。もちろん、あなたのフォームに__iter__で遊ぶこともできますが、あまりにもハッキリになっている可能性があります。あなたがここで何を扱っているのかはっきりしていません:)

関連する問題