【问题标题】:Flask-WTF form posts successfully but validation never occursFlask-WTF 表单发布成功,但从未发生验证
【发布时间】:2014-05-27 09:27:26
【问题描述】:

我已经在 WTF 表格上苦苦挣扎了一段时间。但这个错误,似乎永远不会消失。我当我尝试运行此代码时,表单永远不会验证

观看次数:

@bundle.route('/content/add/', methods=['GET', 'POST'])
@bundle.route('/content/add', methods=['GET', 'POST'])
@bundle.route('/content/edit/<posturl>/', methods=['GET', 'POST'])
@bundle.route('/content/edit/<posturl>', methods=['GET', 'POST'])
@fas_login_required
def addcontent(posturl=None):
    form = CreateContent()
    form_action = url_for('content.addcontent')
    if posturl is not None:
        content = Content.query.filter_by(slug=posturl).first_or_404()
        form = CreateContent(obj=content)
        if form.slug.data == posturl and request.method == 'POST' and form.validate():
            form.populate_obj(content)
            db.session.commit()
            return redirect(url_for('content.addcontent',
                                    posturl=posturl, updated="True"))

    else:
        if request.method == 'POST' and form.validate():
            query = Content(form.title.data,
                            form.slug.data,
                            form.description.data,
                            form.media_added_ids.data,
                            form.active.data,
                            form.tags.data,
                            g.fas_user['username'],
                            form.type_content.data
                            )
            try:
                db.session.add(query)
                db.session.commit()
                # Duplicate entry
            except Exception as e:
                return str(e)
            return redirect(url_for('content.addcontent',
                                    posturl=form.slug.data, updated="True"))
        else:
            print "Please validate form"
    return render_template('content/edit_content.html', form=form,
                           form_action=form_action, title="Create Content")

表单类:

# -*- coding: utf-8 -*-
from flask.ext.wtf import Form
from wtforms import TextField, TextAreaField
from wtforms import BooleanField, SelectField, validators
from wtforms.validators import Required

__all__ = ['CreateContent']


class CreateContent(Form):
    title = TextField(
        'Title',  [validators.Length(min=4, max=255)])
    slug = TextField(
        'Url-Slug', [validators.Length(min=4, max=255)])
    description = TextAreaField('Content', [validators.Length(min=4)])
    media_added_ids = TextField('media')
    type_content = SelectField(u'Content Type',
                               [Required()],
                               choices=[('blog', 'Blog Post'),
                                        ('media', 'Lecture'),
                                        ('doc', 'Documentation')]
                               )
    # Comma seprated media id's
    active = BooleanField('Published')
    tags = TextField('Tags', [Required()])
    # Comma seprated tag id's

还有我的模板:

    {% extends "base.html" %}
    {% block title %}
        {{ title }}
    {% endblock %}
    {% block content %}
    {% from "_formhelpers.html" import render_field %}
    <div id="Create Content">
        <center><h3> {{ updated }} </h3></center>
        <h2>{{  title  }}</h2>
        <form method="post" action="">
            <fieldset>
                <legend></legend>
                {{ render_field(form.title) }}
                {{ render_field(form.slug ) }}
                {{ render_field(form.description ) }}
                {{ render_field(form.media_added_ids)}}
                {{ render_field(form.type_content) }}
                {{ render_field(form.active) }}
                {{ render_field(form.tags )}}
        </fieldset>
        <input type="submit" class="button" value="Save"/>
    </form>
    </div>
    {% endblock %}

我们将不胜感激任何帮助

【问题讨论】:

  • 您能否更具体地了解该错误?
  • 让我详细解释一下。当我将表格中的字段留空时。它会通知我验证错误,但是当我填写表单中的所有值时。然后提交表单..即使 form.validate() 返回 false。并且数据永远不会进入数据库
  • 将此添加到您的代码中以查看表单未验证的原因:打印 form.errors()
  • fpaste.org/105130/06843140 这不打印任何内容。
  • Hammad,您能否提供一个简单的脚本 (sscce.org) 来说明您的问题。我认为我们不能在上面剪切和粘贴您的代码来重新创建问题。如果无法重新创建它,我们只是在进行随机猜测。重现问题越容易,您就越有可能吸引愿意帮助解决问题的人。

标签: python flask-sqlalchemy wtforms flask-wtforms


【解决方案1】:

如果在烧瓶应用程序设置中激活了 CSFR 令牌,则每个表单中都会包含一个 CSFR 令牌。如果开发人员已激活该设置并且未将其包含在表单模板中,Flask WTF 将自动拒绝该请求。

解决这个问题的方法是使用以下标签:

{{form.hidden_tag()}} 

添加后,CSFR id 将包含在请求中并发送到视图以供 WTForms 验证。

如果您没有包含此标记,form.errors 字典中将不会出现错误。如果您遍历此字典,则不会显示错误,但 form.validate 方法将返回 false。

【讨论】:

    【解决方案2】:

    如果在您的Flask 设置中激活了CSRF 令牌,Flask-WTF 会自动添加它。如果此设置处于活动状态且未包含在表单提交中,则提交将被拒绝。这种情况下的解决方案是在模板中添加hidden_tag字段,使其包含在表单提交中。

    {{form.hidden_tag()}} 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多