【问题标题】:Django Form Wizard with Conditional Questions带有条件问题的 Django 表单向导
【发布时间】:2013-08-12 10:59:44
【问题描述】:

在我的 Django 应用程序中,我目前有一个带有几个表单类的表单向导。我想有条件提出问题的能力。这意味着如果用户为某个问题选择“是”,则表单中的另一个问题将成为必填项,并且 javascript 将使该问题可见。我在网上找到了一个如何执行此操作的示例,但是它不起作用。有关如何创建此功能的任何建议?

class QuestionForm(forms.Form):

COOL_LIST = (
    ('cool','Cool'),
    ('really cool','Really Cool'),
)

YES, NO = 'yes','no'

YES_NO = (
    (YES,'Yes'),
    (NO,'No'),
)

are_you_cool = forms.ChoiceField(choices=YES_NO,label='Are you cool?')
how_cool = forms.MultipleChoiceField(required=False,widget=CheckboxSelectMultiple, choices=COOL_LIST,label='How cool are you?')

def __init__(self, data=None, *args, **kwargs):
    super(QuestionForm, self).__init__(data, *args, **kwargs)

    if data and data.get('are_you_cool', None) == self.YES:
        self.fields['how_cool'].required = True

【问题讨论】:

  • 您必须了解 Web 客户端-服务器流程。对于您的问题,您有两个选择:链接表单,因此对于发送给客户端并由他提交的每个表单,服务器都会根据您的条件向客户端发送一个新表单。这是标准解决方案。另一种情况是:您只向客户端发送一个表单,但当他填写字段时,表单会发生变化与您的服务器没有任何通信。这是Ajax方式,你更喜欢什么?

标签: python django conditional django-formwizard


【解决方案1】:

尝试用自定义的clean_are_you_cool 方法替换表单的__init__ 方法。因此,如果用户提交值 Yes,您应该检查是否也填充了 how_cool 字段。您还应该在客户端执行此操作以提供出色的用户体验。像这样的形式:

def clean_are_you_cool(self):
    if self.cleaned_data.get('are_you_cool', None) == 'Yes':
        if self.cleaned_data.get('how_cool', None) is not None:
           #  Actions for cool user. 
           pass
    #  Or if user not cool.

【讨论】:

  • 抱歉耽搁了这么久。我不得不处理一些其他代码,并决定将其推迟到以后。我只是将我的代码更改为类似于 [if data and data.get('drink', None) == "yes":] 而不是 self.YES 并且它有效。这在大多数情况下应该有效。感谢您的建议。
猜你喜欢
  • 2013-07-24
  • 2012-07-13
  • 2019-11-22
  • 2015-08-19
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
相关资源
最近更新 更多