【问题标题】:How to have radio buttons with Materialize and WTForms?如何使用 Materialise 和 WTForms 设置单选按钮?
【发布时间】:2017-01-04 23:35:09
【问题描述】:

在 Materialize 中,您使用属性 name 定义单选按钮的单选组,但 Flask-WTForms 将输入与属性 name 绑定。

如果我的模板中有以下内容:

{{ form.radio1(type='radio', name='group1') }}
{{ form.radio2(type='radio', name='group1') }}

会有错误:

TypeError: html_params() got multiple values for keyword argument 'name'

如果我们不添加名称,收音机将无法像预期的那样像复选框一样工作。

我该如何解决这个问题?

这是我的表单类:

class AbcForm(FlaskForm):
    field1 = HiddenField('Field1')
    field2 = HiddenField('Field2')

然后在运行时我会动态添加收音机,这里有一个简化:

class F(AbcForm):
    pass

    setattr(F, radio1, BooleanField('Radio1')
    setattr(F, radio2, BooleanField('Radio2')

form = F(field1=x, field2=y)

【问题讨论】:

    标签: python flask materialize flask-wtforms


    【解决方案1】:

    您不能在您的字段中设置name 属性,wtforms 已经为您完成了。

    使用 RadioField 代替 HiddenField:

    from wtforms import RadioField
    from flask_wtf import Form
    
    class YourForm(Form):
        radio_group = RadioField('label', choices=[('value','description'),('value_two','some other description')])
        (...)
    

    然后,在您的端点中:

    @route('/your/route')
    def your_endpoint():
        your_form = YourForm()
        (...)
        return render_template('/your/template.html', form=your_form)
    

    最后,在您的模板中:

    <form action="#">
        {% for subfield in form.radio_group %}
        <p>
            {{ subfield }}
            {{ subfield.label }}
        </p>
        {% endfor %}
    </form>
    

    这会生成以下代码:

      <form action="#">
        <p>
          <input id="radio_group-0" name="radio_group" type="radio" value="value">
          <label for="radio_group-0">description</label>
        </p>
        <p>
          <input id="radio_group-1" name="radio_group" type="radio" value="value_two">
          <label for="radio_group-1">some other description</label>
        </p>
      </form>
    

    如果模板中包含了具体化,它将正确呈现单选按钮,如this plunker 所示。

    【讨论】:

    • 并不能真正解决我的问题:默认小部件 {{ subfield }} 无法用于物化,因此我必须手动制作,并且手动完成我必须设置名称属性,因为这就是 materialize 将一堆收音机分组的方式,即使我使用 RadioField,它仍然会给我带来同样的问题
    • 它按预期工作。这是渲染模板的一个小插曲:plnkr.co/edit/qutaW8tXld84H5PbaLE5?p=preview 请完全按照描述的步骤进行操作,不要忘记在模板中包含具体化文件
    • 刚刚使用生成的代码和 plunker 编辑了答案。如果您在执行这些步骤后从我那里得到不同的生成代码,请更新您的问题,以便我检查它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2018-06-26
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    相关资源
    最近更新 更多