Flask wtform forms.validate_on_submit()始终为false

时间:2014-06-15 21:31:58

标签: python-2.7 flask-wtforms

我在这里和其他一些地方看过其他类似的问题,但解决方案似乎对我的问题没有帮助。尽管如此,我没有看到我所获得的这个简单代码与其他类似代码之间存在太大差异。特别是这一个Flask - wtforms: Validation always false

forms.validate_on_submit()总是假的,我看不出原因。 我正在阅读Miguel Grinberg的Flask Web开发书,但我想改变一些东西以便了解更多信息。 它在html模板中使用wtf.quick_form(form)时有效,但如果我删除了quickform条目并放入表单字段,那么它不起作用 屏幕只是刷新,并且不会将陌生人更改为输入的任何名称

HTML索引模板

 {% extends "base.html" %}
 {% import "bootstrap/wtf.html" as wtf %}

 {% block title %}Flasky{% endblock %}

 {% block page_content %}
 <div class="page-header">
     <h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>

 </div>
 <form action="" method='POST'>

  {{ form.name.label }} <br>
  {{ form.name }}
{{ form.submit }}
</form>
{% endblock %}

相关代码hello.py

from flask import Flask, render_template, request
from flask.ext.script import Manager
from flask.ext.bootstrap import Bootstrap
from flask.ext.moment import Moment
from flask.ext.wtf import Form
from wtforms import StringField, SubmitField, RadioField, TextField, validators
from wtforms.validators import Required
from wtforms.validators import DataRequired

app = Flask(__name__)



class NameForm(Form):
    name = StringField('What is your name?',validators=[Required()] )

submit = SubmitField('Submit')

@app.route('/', methods=['GET', 'POST'])
def index():
     name = None
     form = NameForm(request.form)  #From the docs I read I don't need 
                                    # request.form but it
                                    # doesn't work either with it or without it

     if form.validate() == True:
      name='True'  #never happens  is not validating or is always set to False for 
                       # some reason

     if form.validate_on_submit(): #isn't validating or working
          name = form.name.data  #'Stranger' will disappear from the html template and 
                            #replaced   with the name the user entered in the
                            # Stringfield 

          form.name.data = ''  #clear stringfield for next round

          return render_template('index.html',form=form, name=name)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=True)'

我不理解\缺少什么? 感谢

2 个答案:

答案 0 :(得分:20)

问题在于wtf没有找到CSRF令牌作为表单数据的一部分。添加{{ form.hidden_tag() }}{{ form.csrf_token }}作为表单的顶部元素。

答案 1 :(得分:0)

对于像我这样使用bootstrap模板表单的人来说,这只是一个小小的提醒。

请务必在输入标记中添加“name”属性。例如,

<label>Your name</label>
<input name = 'name' required>  

<label>Your email</label>
<input name = 'email' required>