0

我正在尝试在 Django 中创建一个验证表单,向用户提供一个选项列表,其中只有一个是有效的。

例如,对于喜欢披萨配料包括菠萝和羊乳干酪的用户来说——</p>

你最喜欢的披萨配料是什么?

  • 火腿
  • 菠萝
  • 凤尾鱼

每次选择都应该是随机的,无论是顺序还是值,但总是有一个有效的答案。例如,如果用户刷新页面,表单可能是——</p>

你最喜欢的披萨配料是什么?

  • 马苏里拉奶酪
  • 火腿
  • 羊乳干酪

我如何构建这样的表格?我被淹没了。我们必须在某处记录特定表单的有效选择是什么:

  • 在数据库中为每个问题创建条目(不可扩展)?
  • 在会话中设置它(hacky)?
  • 基于用户 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,只有一个是PizzaTopping也在 中UserProfile.favourite_pizza_toppings

当用户发布表单时,我们需要验证表单——这是棘手的一点。我们必须以某种方式记录每个实例化表单的有效选择(abc)。我们应该怎么做?

4

1 回答 1

5

您将需要在表单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 回答