繁体   English   中英

AttributeError: 'EditForm' 对象没有属性 'validate_on_submit'

[英]AttributeError: 'EditForm' object has no attribute 'validate_on_submit'

我有一个包含以下文件的小型编辑应用程序。 当我提交表单时,它显示我AttributeError: 'EditForm' object has no attribute 'validate_on_submit'谁能告诉我这是什么问题?

表格.py

from flask.ext.wtf import Form
from wtforms import Form, TextField, BooleanField, PasswordField, TextAreaField, validators
from wtforms.validators import Required

class EditForm(Form):
    """edit user Profile EditForm"""
    username = TextField('username', [validators.Length(min=3, max=50), validators.Required()])
    email = TextField('email', [validators.Length(min=5, max=100), validators.Email, validators.Required()])
    password = PasswordField('password', [validators.Required()])
    age = TextField('age', [validators.Length(min=1, max=3), validators.Required()])
    about_user = TextAreaField('about_user', [validators.Length(max=500)])
    img_url = TextField('img_url')

视图.py

from flask import render_template, url_for, flash, g, redirect, session, request
from flask.ext.login import login_user, logout_user, current_user, login_required
from forms import LoginForm, RegisterForm, EditForm

@app.route('/edit', methods = ['GET', 'POST'])
def edit():
    form = EditForm(request.form)

    if request.method == 'POST' and form.validate_on_submit():
        g.user.username = form.data.username
        g.user.email = form.data.email
        g.user.age = form.data.age
        g.user.img_url = form.data.img_url
        g.user.about_user = form.data.about_user
        db.session.add(g.user)
        db.session.commit()
        flash('Your changes saved successfully')
        return redirect(url_for('edit')) 
    else:
        form.data.username = g.user.username
        form.data.email = g.user.email
        form.data.age = g.user.age
        form.data.img_url = g.user.img_url
        form.data.about_user = g.user.about_user
    return render_template('edit.html',
        title = 'Edit Profile',
        form = form)

编辑.html

{% extends "base.html" %}
{% block content %}
    <div>
    <form action="" method="post" name="edit">
        <table>
            <tr>
                <td>Username</td>
                <td>{{ form.username }}</td>
            </tr>
            <tr>
                <td>E-mail</td>
                <td>{{ form.email }}</td>
            </tr> 
            <tr>
                <td>Age</td>
                <td>{{ form.age }}</td>
            </tr>
            <tr>
                <td>Choose Avatar</td>
                <td>{{ form.img_url }}</td>
            </tr>
            <tr>
                <td>About me</td>
                <td>{{ form.about_user(cols = 50, rows = 5) }}</td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" name="submit" value="Save changes"/></td>              </tr>
            </table>
        </form>
    </div>
{% endblock %}

您导入了错误的Form对象:

from flask.ext.wtf import Form
from wtforms import Form, TextField, BooleanField, PasswordField, TextAreaField, validators

第二个导入行从wtforms导入Form ,替换从flask_wtf导入。 从第二个导入行中删除Form (并将您的flask.ext.wtf导入更新为flask_wtf 以保持面向未来):

from flask_wtf import Form
from wtforms import TextField, BooleanField, PasswordField, TextAreaField, validators

补充两点:

  1. 表单将为您从请求中获取值,无需传入request.form

  2. validate_on_submit()测试请求方法,不需要自己做。

以下就足够了:

@app.route('/edit', methods = ['GET', 'POST'])
def edit():
    form = EditForm()

    if form.validate_on_submit():

Flask-WTF 0.13 版(2016 年 9 月FlaskForm日发布)开始,要使用的正确对象被命名为FlaskForm ,以便更容易区分它和wtforms Form类:

from flask_wtf import FlaskForm

创建表单时,您必须确保将class EditForm(FlaskForm)添加到您的类中:这就是我的错误的来源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM