我制作了Flask WTForm,以允许用户确认一系列信息。 我显示了预先填充了信息的表单,用户可以对其进行修改并提交表单。 但是,即使没有错误发生(form.errors为空),form.validate()也总是返回False。 我究竟做错了什么?
应用程式
@app.route('/validation', methods=['GET', 'POST'])
def validation():
# initiate form
item = session.get('item', None)
form = AttrForm(request.form)
# pre-fill validation
form.price.data = item['price']
form.surface.data = item['surface']
form.rooms.data = item['rooms']
form.year.data = item['year']
# get area options and pre-fill
options = get_options()
form.subarea.choices = options
form.subarea.data = get_choice(options, item['subarea'])
# catch errors
if not form.validate_on_submit():
display = {'url': False, 'fill' : True, 'valid' : False}
return render_template('index.html', display=display, form=form)
# set new values
item['price'] = request.form['price']
item['surface'] = request.form['surface']
item['rooms'] = request.form['rooms']
item['year'] = request.form['year']
item['subarea'] = request.form['subarea']
session['item'] = item
return redirect(url_for('results'))
的HTML
{% block attr_form %}
Attribute Form
Loyer (hors charges) | {{ render_field(form.price) }} |
Surface | {{ render_field(form.surface) }} |
Année de construction | {{ render_field(form.year) }} |
Nombre de pièces | {{ render_field(form.rooms) }} |
Quartier administratif | {{ render_field(form.subarea) }} |
{% endblock %}
帮手
{% macro render_field(field) %}
{{ field }}{% if field.errors %}
{% for error in field.errors %}
{{ error }}
{% endfor %}
{% endif %}
{% endmacro %}
形成
class AttrForm(FlaskForm):
price = DecimalField('price', validators=[DataRequired()])
subarea = SelectField('subarea', coerce=int)
surface = DecimalField('surface', validators=[DataRequired()])
year = IntegerField('year', validators=[DataRequired()])
rooms = IntegerField('rooms', validators=[DataRequired()])
我们可以看到AttrForm类吗?
当然! 我编辑了问题。
首先,请确保在烧瓶配置中定义了SECRET_KEY。 您需要执行此操作才能使CSRF保护生效。 http://flask-wtf.readthedocs.io/en/stable/csrf.html
其次,通过插入form.hidden_tag将csrf令牌添加到html表单中。
{{ form.hidden_tag() }}
...
有关详细信息,请参见http://flask-wtf.readthedocs.io/en/stable/quickstart.html。
好吧,那是Flask友好的提醒,安全性很重要! 感谢您的提示!