2016-11-05 49 views
1

我试图在用户提交时提出错误而未选择无线电选项,但它不工作。当我渲染这样的字段:{{ render_field(form.example) }}它打印(self.gettext('PICK SOMETHING'),但是当我使用下面什么格式发生了:Flask-WTForms如何覆盖无线电字段上的pre validate

{% 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引发错误如果我提交没有选择任何选择?

回答

0

试试这个脚本:

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> 
+0

它不工作。 – roy

+0

你能证明你得到了什么错误吗?你想要什么输出? –

+0

如果我不提交任何内容,我希望它能打印'选择几何'。 – roy