0

選択肢のリストをユーザーに提示する確認フォームをDjangoで作成しようとしていますが、そのうちの1つだけが有効です。

たとえば、お気に入りのピザのトッピングにパイナップルとロックフォールが含まれているユーザーの場合— </ p>

あなたの好きなピザのトッピングは何ですか?

  • ハム
  • パイナップル
  • アンチョビ

選択肢は、順序と値の両方で毎回ランダムである必要がありますが、常に1つの有効な答えがあります。たとえば、ユーザーがページを更新した場合、フォームは次のようになります— </ p>

あなたの好きなピザのトッピングは何ですか?

  • モッツァレラチーズ
  • ハム
  • ロックフォール

このようなフォームを作成するにはどうすればよいですか?私は圧倒されています。特定のフォームの有効な選択をどこかに記録する必要があります。

  • 質問ごとにデータベースにエントリを作成しますか(スケーラブルではありません)?
  • セッションで設定しますか(ハッキー)?
  • ユーザーIDに基づく(予測可能である可能性があります)?

編集—ピザのトッピングのリストをデータベースに保存します— </ p>

class UserProfile(Model):
    favourite_pizza_toppings = ManyToManyField(PizzaTopping)

私が欲しいのは次のようなフォームです— </ p>

class QuestionForm(Form):
    questions = ChoiceField(choices=(('a', RANDOMLY_CHOSEN_OPTION_A),
                                     ('b', RANDOMLY_CHOSEN_OPTION_B),
                                     ('c', RANDOMLY_CHOSEN_OPTION_C)))

ここで、インスタンス化されるたびに、すべてRANDOMLY_CHOSEN_OPTIONがからランダムに選択されPizzaTopping.objects.all、1つだけがに含まPizzaToppingUserProfile.favourite_pizza_toppingsます。

ただし、ユーザーがフォームをPOSTするときにフォームを確認する必要がありますが、これは注意が必要です。インスタンス化された各フォームの有効な選択肢(、、、または)abなんとかして記録する必要があります。cどうすればこれを行うことができますか?

4

1 に答える 1

5

form initメソッドで選択肢を作成する必要があります。そうしないと、ページが読み込まれるたびにフォーム要素の選択肢が同じになります(変更されません)。

class QuestionForm(Form):
    questions = ChoiceField()

    def __init__(self, *args, **kwargs):
        super(QuestionForm, self).__init__(*args, **kwargs)
        self.fields['questions'].choices = set_up_choices() # function that creates list

    clean_questions(self):
        # do your validation of the question selection
        # here you could check whether the option selected matches
        # a correct value, if not throw a form validation exception
        return self.cleaned['questions']
于 2012-09-05T14:23:36.070 に答える