2016-11-05 3 views
1

사용자가 라디오 선택을 선택하지 않고 제출하고 작동하지 않을 때 오류가 발생하려고합니다. 나는이 같은 필드를 렌더링 할 때 : {{ render_field(form.example) }} 그것은 (self.gettext('PICK SOMETHING')를 인쇄,하지만 난 아무것도 아래의 형식을 사용할 때 발생합니다Flask-WTForms 라디오 필드에서 사전 유효성 검사를 재정의하는 방법

{% 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을 대체 할 수 있습니다 선택하지 않고 제출하면 어떻게됩니까? 그것은 작동하지 않습니다

{% 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

이 스크립트를 사용해보십시오.
+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 : – roy

+0

어떤 오류가 발생했는지 보여줄 수 있습니까? 그리고 원하는 출력은 무엇입니까? –

+0

아무 것도 제출하지 않으면 'PICK SOMETHING'을 인쇄하고 싶습니다. – roy