WTForm不会验证

时间:2016-09-02 14:39:29

标签: flask-wtforms

我一直关注Flask(https://www.udemy.com/python-flask-course/)上的Udemy课程,其中讲师展示了如何使用WTForms。我试图复制这个,但没有得到它来验证表单。

表单在文件admin / form.py

中定义
from flask_wtf import Form
from wtforms import validators, StringField, PasswordField
from wtforms.fields.html5 import EmailField

class TestForm(Form):
data = StringField('Data', [validators.Required()])

数据库模型在admin / models.py

中定义
from wtform_test import db

class TestData(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    data = db.Column(db.String(4))

    def __init__(self, data):
        self.data = data

    def __repr__(self):
        return '<Test %r>' % self.data

最后路由在admin / views.py

中定义
from wtform_test import app
from admin.models import TestData
from admin.form import TestForm
from flask import redirect, url_for, sessions

@app.route('/add_test_data', methods=('GET', 'POST'))
def add_test_data():
    form = TestForm()
        if form.validate_on_submit():
            test_data = TestData(form.data)
            db.session.add(test_data)
            db.session.commit()
            return redirect(url_for('index'))
        else:
            return "Could not validate form"

当我运行时,我总是以“无法验证表单”结束。我没有收到任何其他错误消息,所以我不知道从哪里开始寻找。

1 个答案:

答案 0 :(得分:0)

所以我发现了问题。在上面的代码中,没有表单的呈现。这应该通过将add_test_data的应用程序路由更改为以下内容来完成:

@app.route('/add_test_data', methods=('GET', 'POST'))
def add_test_data():
    form = TestForm()
    if form.validate_on_submit():
        test_data = TestData(form.data)
        return "Success!"
    else:
        return render_template('add_test_data.html', form=form)

然后将html表单添加为add_test_data.html:

{% extends "base.html" %}
{% block title %}Enter test data{% endblock %}
{% block content %}

<div class="row">

  <div class="col-md-offset-3 col-md-6">
      <h3>Test data</h3>
      {% from "_formhelpers.html" import render_field %}
      <form method="POST" action="{{ url_for('add_test_data') }}" role="form">

          {{ render_field(form.data, class='form-control') }}

          <button type="submit" class="btn btn-default">Register</button>
      </form>
  </div>