Django“动态”验证表

2024-04-25 07:25:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如,如果用户最喜欢的比萨配料包括菠萝和罗克福-

What is your favourite pizza topping?

  • Ham
  • Pineapple
  • Anchovie

每次选择的顺序和值都应该是随机的,但总是有一个有效答案。例如,如果用户刷新页面,表单可能是-

What is your favourite pizza topping?

  • Mozarella
  • Ham
  • Roquefort

我如何建立这样一个形式?我被淹没了。我们必须在某处记录一个特定表单的有效选项:

  • 在数据库中为每个问题创建条目(不可伸缩)?你知道吗
  • 在会话中设置(hacky)?你知道吗
  • 基于用户ID(可以预测)?你知道吗

编辑-我们将比萨配料列表存储在数据库中-

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

我想要的是一种形式,比如-

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)。我们怎么做?你知道吗


Tags: 用户表单列表youris选项randomlywhat
1条回答
网友
1楼 · 发布于 2024-04-25 07:25:34

您需要在forminit方法中建立选项,否则每次加载页面时,表单元素选项都是相同的(它们不会改变)。你知道吗

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']

相关问题 更多 >