WTF form.validate_on_submit() 不起作用

问题描述 投票:0回答:5

我有以下代码,并且正在提交表格。当我点击提交按钮时,我的表单验证会打印出

False
。我已经检查并确保我包含了不同帖子中的所有内容,但我无法对其进行验证。我是不是做错了什么?

@app.route('/index.html', methods=['GET', 'POST'])
    def index():   
            user = {'nickname': 'Rafa'}
            form = FilterForm()
            print("about to validate", file=sys.stderr)
            if form.validate_on_submit():
                    print("validated", file=sys.stderr)
                    filters_array = form.filter.split(',')
                    streaming(filters_array)
                    response = {"response", "yes"}
                    redirect("/authenticate")



            return render_template('index.html',
                    title="Home",
                    user=user,
                    form=form)

    class FilterForm(Form):
            filter = StringField('filter', validators=[DataRequired()])

这是我的 Jinja 文件

    {% block content %}    
      <h1> I have successfully navigated to the title pagee </h1> 
      <h1> Hello, {{user.nickname}}!</h1> 
      <h1> Get Tweets </h1> 
      <p> Please enter a comma delimited list of filters</p>   
      <form action="" method="post" name="login"> 
        {{form.filter(size=80)}} 
      <input type="submit" value="Get Tweets!"> 
      </form> 
    {% endblock %}
flask wtforms flask-wtforms
5个回答
25
投票

FilterForm
不应与
def index()
缩进同一水平。更重要的是,您的表单中没有
csrf_token
。这将阻止它验证。

将此添加到您的表单中:

{{ form.csrf_token }}

最后,当使用 wtforms 进行验证时,错误将填充到表单对象中。因此,在

if validate
之后,尝试打印
form.errors
,您就会发现到底出了什么问题。


6
投票

另一个要求是,当您使用

form.validate_on_submit
时,您必须确保您已使用表单模型的所有字段。


1
投票

我在你的代码中发现了一些语法错误,也许这会导致你遇到的问题。

首先,你的装饰器中的问题app.route

app.route('/index')

第二,在你的html文件中:

form action='/index'

0
投票

它与这个确切的问题无关,但是如果你遇到这样的问题并且错误没有显示任何内容,你有

{{ form.csrf_token }}
{{ form.hidden_tag() }}
,ypu以表格形式打印了所有数据,看起来不错,这意味着它是百分百的html 表单中某处有拼写错误。

尝试使用模板重写表单: 在

_formhelpers.html

{% macro render_field(field) %}
  <dt>{{ field.label }}
  <dd>{{ field(**kwargs)|safe }}
  {% if field.errors %}
    <ul class=errors>
    {% for error in field.errors %}
      <li>{{ error }}</li>
    {% endfor %}
    </ul>
  {% endif %}
  </dd>
{% endmacro %}

用途:

{% from "_formhelpers.html" import render_field %}
<form method=post>
  <dl>
    {{ form.hidden_tag() }}
    {{ render_field(form.username) }}
    {{ render_field(form.email) }}
    {{ render_field(form.password) }}
    {{ render_field(form.confirm) }}
    {{ render_field(form.accept_tos) }}
  </dl>
  <p>{{ form.submit }}
</form>

更容易避免拼写错误和其他错误。

来源: https://flask.palletsprojects.com/en/1.1.x/patterns/wtforms/#forms-in-templates


0
投票

我也有同样的问题。我只是将

{{ form.hidden_tag() }}
放入 html Jinja 模板中,嵌套在表单标签中。现在,一切正常。

以下是我在这里安装的一些 Flask 相关软件包的版本:

  • 烧瓶==3.0.1
  • Flask-WTF==1.2.1
  • Jinja2==3.1.3
  • Werkzeug==3.0.1
  • WTForms==3.1.2
© www.soinside.com 2019 - 2024. All rights reserved.