【问题标题】:Flask form submisson not workingFlask表单提交不起作用
【发布时间】:2014-04-04 06:12:55
【问题描述】:

我有一个非常简单的表格和表格,我正在尝试提交以使用 python 烧瓶。

这个类创建了 sqllite 表(这个工作):

class Country(db.Model):
    __tablename__ = 'countries'
    countryid = db.Column(db.Integer, primary_key=True)
    country = db.Column(db.String(65), unique=True, index=True)
    active = db.Column(db.Boolean, default=True)

    def __init__(self, country):
        """
        Used to create a Country object in the python server scope
        """
        self.country = country

通过这个类生成表单:

class CountryForm(Form):
    country = StringField('Country name', validators=[Length(0, 64)])
    submit = SubmitField('Submit') 

页面通过视图显示:

@main.route('/country', methods=['GET','POST'])
def show_CountryForm():
    form = CountryForm()
    print 'Form Values',form
    if form.validate_on_submit():
        ctry = Country(country=form.country.data)
        db.session.add(ctry)
        flash('The country has been added.')
        return redirect(url_for('chinese'))
    return render_template("country.html", form=form)

html模板页面为:

{% extends "base.html" %}
{% import "_macros.html" as macros %}

{% block title %}Countries{% endblock %}

{% block page_content %}
<div class="container">
<form method="POST" action="/country">
    <div>
        <label for="country" class="label_control"> 
            Country
        </label>
        <div class="form_control" id="country">
            {{ form.country }}
        </div>
    </div>
    {{ form.submit() }}
</form>
</div>


{% endblock %}

所以一切似乎运行正常,没有错误,但记录没有添加到数据库中。任何帮助将不胜感激。

【问题讨论】:

  • 你在使用Flask-WTF吗?如果是这样,CSRF 保护是enabled by default,但您没有使用{{ form.hidden_tag() }} 来包含csrf_token。这会导致表单引发错误,但您不会在任何地方显示这些错误(例如form.errors)。
  • 这就是解决问题的方法。非常感谢。

标签: python python-2.7 flask flask-sqlalchemy flask-wtforms


【解决方案1】:

这里有两个问题。一个是您的表单永远不会验证,因为它在任何地方都没有 form.hidden_tag() 并且您没有在页面上显示错误。以下添加了令牌和 div,以便在发生任何表单错误时显示它们。

第二个问题是您永远不会将 db 会话提交到数据库,因此即使您的表单经过验证,您的数据也不会被保存。

表单未验证且未显示错误:

在您的表单中,尝试添加{{ form.hidden_tag() }},之后您的表单应该可以很好地提交。如果不添加,表单将引发错误,因为它不再是有效的 XHTML。

<div class="container">
<form method="POST" action="/country">
    <div>
        <label for="country" class="label_control"> 
            Country
        </label>
        <div class="form_control" id="country">
            {{ form.hidden_tag() }}
            {{ form.country }}
        </div>
        <div class="form_errors">
           {{ form.errors }}
       </div>
    </div>
    {{ form.submit() }}
</form>
</div>

数据未保存:

您不会在任何地方调用db.session.commmit(),这就是为什么session 永远不会提交给数据库的原因。

@main.route('/country', methods=['GET','POST'])
def show_CountryForm():
    form = CountryForm()
    print 'Form Values',form
    if form.validate_on_submit():
        ctry = Country(country=form.country.data)
        db.session.add(ctry)
        db.session.commit() # This saves the data.
        flash('The country has been added.')
        return redirect(url_for('chinese'))
    return render_template("country.html", form=form)

【讨论】:

  • 我忘记补充了,我没有看到显示国家已添加的消息。即使没有提交记录也不应该显示吗?
  • 我是这么认为的。这些操作都没有发生。
猜你喜欢
  • 2022-01-09
  • 2012-09-28
  • 2016-04-06
  • 2015-09-15
  • 2015-10-16
  • 2017-02-21
  • 2014-03-21
  • 2017-05-24
相关资源
最近更新 更多