【问题标题】:Flask-WTForms How to override pre validate on Radio FieldsFlask-WTForms 如何覆盖无线电字段的预验证
【发布时间】:2016-11-05 09:34:34
【问题描述】:

当用户在未选择单选选项的情况下提交并且它不起作用时,我试图引发错误。当我呈现这样的字段时:{{ render_field(form.example) }} 它会打印(self.gettext('PICK SOMETHING'),但是当我使用下面的格式时没有任何反应:

    {% for subfield in form.religion %}
        {{ render_field(subfield, class_="foo") }}
        {{ render_field(subfield.label) }}
    {% endfor %}

radio.py

class ReligionField(SelectField):
    widget = ListWidget(prefix_label=False)
    option_widget = RadioInput()

    def pre_validate(self, form):
        for v, _ in self.choices:
            if self.data == v:
                break
        else:
            raise ValueError(self.gettext('PICK SOMETHING'))

class ReligionForm(FlaskForm):
    religions = ['Christian', 'Muslim', 'Hindu', 'Buddhist']
    choices = [(x.lower(), x.title()) for x in sorted(religions)]
    religion = ReligionField('Religion', validators=[DataRequired()], choices=choices, render_kw={"class":"post", "type":"radio"})

@app.route('/',methods=['post','get'])
def hello_world():
    form = ReligionForm()
    if form.validate_on_submit():
        print form.religion.data
    else:
        print form.errors
    return render_template('radio.html', form=form)

如果我在未选择任何选项的情况下提交,如何覆盖 pre_validate 以引发错误?

【问题讨论】:

    标签: python flask wtforms flask-wtforms


    【解决方案1】:

    试试这个脚本:

    from flask import Flask
    from flask import render_template
    from flask import request
    from flask import flash
    from flask import redirect
    from flask_wtf import FlaskForm
    from wtforms import SelectField
    from wtforms.widgets import ListWidget, RadioInput
    from wtforms.validators import DataRequired
    
    
    app = Flask(__name__)
    
    class ReligionField(SelectField):
        widget = ListWidget(prefix_label=False)
        option_widget = RadioInput()
    
        def pre_validate(self, form):
            for v, _ in self.choices:
                if self.data == v:
                    break
            else:
                raise ValueError(self.gettext('PICK SOMETHING'))
    
    class ReligionForm(FlaskForm):
        religions = ['Christian', 'Muslim', 'Hindu', 'Buddhist']
        choices = [(x.lower(), x.title()) for x in sorted(religions)]
        religion = ReligionField('Religion', validators=[DataRequired()], choices=choices, render_kw={"class":"post", "type":"radio"})
    
    
    @app.route('/',methods=['GET','POST'])
    def hello_world():
        form = ReligionForm(request.form)
    
        if request.method == 'POST':
            if form.validate_on_submit():
            print form.religion.data
            else:
            print form.religion.errors[0]
            flash(form.religion.errors[0])
            return redirect('/')
        return render_template('radio.html', form=form)
    
    
    if __name__ == "__main__":
        app.run()
    

    radio.html

    {% with messages = get_flashed_messages() %}
      {% if messages %}
        <ul class=flashes>
        {% for message in messages %}
          <li>{{ message }}</li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}
    
    <form method="post">
    {% for subfield in form.religion %}
            <li>{{subfield.label}} {{subfield}} </li>
        {% endfor %}
    
    <button>Submit</button>
    </form>
    

    【讨论】:

    • 你能说明你遇到了什么错误吗?你想要什么输出?
    • 如果我什么都不提交,我希望它打印“PICK SOMETHING”。
    • 查看代码中使用的 print form.religion.errors[0]。
    • 将您的代码更改为打印 form.errors[0] 而不是打印 form.errors
    • 我不认为这是问题所在,this 会引发错误。但是当我使用subfield 时,它不会。
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 2016-05-30
    • 2023-03-16
    • 1970-01-01
    • 2015-08-06
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多