【问题标题】:Django "dynamic" verification formDjango“动态”验证表
【发布时间】:2012-08-30 04:40:03
【问题描述】:

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

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

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

  • 火腿
  • 菠萝
  • 凤尾鱼

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

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

  • 马苏里拉干酪
  • 火腿
  • 罗克福

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

  • 在数据库中为每个问题创建条目(不可扩展)?
  • 在会话中设置它(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 中。

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

【问题讨论】:

  • 你现在有代码吗?
  • 看来您需要知道用户的“有效”选择。因此,需要将选择/问题映射到用户。
  • @dm03514—我已经在数据库中有“有效”选择。我会更新问题

标签: python django forms


【解决方案1】:

您将需要在表单 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']

【讨论】:

  • 非常方便。最终只是用随机值(但一个有效值)填充选项,然后在 clean 函数中,根据用户字段检查设置值。简单的
猜你喜欢
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
相关资源
最近更新 更多