Flask-WTForms如何覆盖无线电字段上的预验证 [英] Flask-WTForms How to override pre validate on Radio Fields

查看:62
本文介绍了Flask-WTForms如何覆盖无线电字段上的预验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在用户未选择单选选项的情况下提交错误并且无法正常工作时提出错误.当我渲染这样的字段时: {{render_field(form.example)}} 它会打印(self.gettext('PICK SOMETHING'),但是当我使用格式如下:

I'm trying to raise an error when a user submits without selecting a radio choice and it's not working. When I render the fields like this: {{ render_field(form.example) }} it prints the (self.gettext('PICK SOMETHING'), but when I use the format below nothing happens:

    {% 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 来引发错误?

How can I override pre_validate to raise an error if I submit without selecting any choice?

推荐答案

尝试以下脚本:

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

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>

这篇关于Flask-WTForms如何覆盖无线电字段上的预验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆