wtform wtf validator validate passwordfield fields python forms flask

validator - wtform python



AttributeError: el objeto ''EditForm'' no tiene el atributo ''validate_on_submit'' (1)

Tengo una pequeña aplicación de edición con los siguientes archivos. Cuando presento el formulario, me muestra AttributeError: el objeto ''EditForm'' no tiene atributo ''validate_on_submit'' ¿Alguien puede decirme cuál es el problema?

forms.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'')

views.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)

edit.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 %}


Importó el objeto Form incorrecto:

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

La segunda línea de importación importa Form de wtforms , reemplazando la importación de flask_wtf . Quite el Form de la segunda línea de importación (y actualice su flask.ext.wtf import a flask_wtf para permanecer a prueba del futuro ):

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

Dos notas adicionales:

  1. El formulario tomará valores de la solicitud por usted, no es necesario pasar en request.form .

  2. validate_on_submit() prueba también para el método de solicitud, no es necesario que lo haga usted mismo.

Lo siguiente es suficiente:

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