Django脆形式的if语句,条件表单布局

Posted

技术标签:

【中文标题】Django脆形式的if语句,条件表单布局【英文标题】:if statement in Django crispy form, conditional form layout 【发布时间】:2015-11-26 10:36:08 【问题描述】:

我有一个 Django 清晰的表单:一个带有电子邮件地址、密码字段和提交操作的典型注册表单。

我有一个隐藏字段从我的 urls python 文件中传递给 Django 脆表单,名为“billing_secret”。不同的 URL 的计费秘密是不同的。

目标: 要让条款和条件单选复选框启用/禁用特定计费秘密的提交按钮,因此是 url。

我需要添加两件事。

    在 Crispy 表单中添加 if 语句,以仅显示某个计费机密的 Radio 复选框。例如,如果计费密码是“apples”show radios 并默认为“no”。如果计费秘密是其他任何内容,请隐藏收音机,默认为是。

这是我目前所拥有的(不起作用)。抱歉,我对 Python 完全陌生。

email = forms.EmailField(label=_("Email"))
password1 = forms.CharField(widget=forms.PasswordInput,label=_("Password"))
billing_secret = forms.CharField()
termsandcond = forms.TypedChoiceField(
        label = "Do you agree to the T&C's?",
        choices = ((1, "Yes"), (0, "No")),
        coerce = lambda x: bool(int(x)),
        widget = forms.RadioSelect,
        initial = '0',
        required = True,
    )

def __init__(self, *args, **kwargs):
    billing_secret = kwargs.pop('billing_secret', None)
    super(RegistrationForm, self).__init__(*args, **kwargs)
    self.helper = FormHelper()
    self.helper.form_method = 'post'
    self.helper.form_action = '.'

    self.helper.layout = Layout(
        Field('email', placeholder=_("Email")),
        Field('password1', placeholder=_("Password")),
        Field('billing_secret', value=billing_secret, type="hidden"),

        if billing_secret is 'apples':
            return InlineRadios('termsandcond'),
        else:
            return InlineRadios('termsandcond', initial="1", type="hidden"),

        Submit("save", _("Get Started"),css_class="pull-right"),
    )
    单选按钮值为“no”时禁用提交按钮,“yes”时启用。

我打算加入这个:

http://jsfiddle.net/8YBu5/7/

这样,用户在注册时必须同意条款和条件,然后才能提交他们的详细信息,如果在指定的 url 上,账单密码是“apples”。如果它们在不同的 url 上,则单选不存在并且启用了提交按钮。

【问题讨论】:

【参考方案1】:

默认隐藏按钮:

Submit("save", _("Get Started"),css_class="pull-right", style='display: none;')

并使用 javascript 检查单选按钮,当用户点击接受时,只需选择按钮并显示它。

编辑: 对于条件元素:

self.helper.layout = Layout(
    Field('email', placeholder=_("Email")),
    Field('password1', placeholder=_("Password")),
    Field('billing_secret', value=billing_secret, type="hidden"),
)

if billing_secret is 'apples':
    self.helper.layout.append(InlineRadios('termsandcond'))
else:
    self.helper.layout.append(InlineRadios('termsandcond', initial="1", type="hidden"))
self.helper.layout.append(Submit("save", _("Get Started"),css_class="pull-right", style='display: none;'))

【讨论】:

是的,但我需要收音机仅采用特定 billing_secret 的形式。所以我的第一个问题是如何根据 billing_secret 变量有条件地添加表单元素。一旦我弄清楚我应该能够使用 JS 启用/禁用按钮。谢谢你的建议。 :)【参考方案2】:

另一种添加条件布局的方法是使用自定义函数。

def layout_if(condition, *args):
    if condition:
        return args
    else:
        return ()

然后可以在布局中使用。注意将返回值转换为单独参数所需的星号。

self.helper.layout = Layout(
    Field('email', placeholder=_("Email")),
    Field('password1', placeholder=_("Password")),
    Field('billing_secret', value=billing_secret, type="hidden"),
    *layout_if(billing_secret is 'apples',
               self.helper.layout.append(InlineRadios('termsandcond'))),
    *layout_if(billing_secret is not 'apples',
               self.helper.layout.append(InlineRadios('termsandcond', initial="1", type="hidden"))),
    self.helper.layout.append(Submit("save", _("Get Started"),css_class="pull-right", style='display: none;'))
)

【讨论】:

以上是关于Django脆形式的if语句,条件表单布局的主要内容,如果未能解决你的问题,请参考以下文章

Java中if语句几种形式

Django模板if语句中的分组条件

“python if”语句可以多条件判断吗?

django 脆表单:在表单中嵌套表单集

关于分支语句if和switch的整理

条件语句