Flacon de soi.erreurs.append() - AttributeError: 'tuple' objet n'a pas d'attribut 'append'
Ma petite application d'inscription donne et d'erreur lorsque je tente de valider le soumis de données par l'utilisateur et vérifier si l'e-mail existe.
voici mes fichiers:
formes:
from flask.ext.wtf import Form
from wtforms import TextField, BooleanField, PasswordField, TextAreaField, validators
from wtforms.validators import Required
from app import models
class RegisterForm(Form):
"""RegisterForm class needed for retrieving data from user"""
username = TextField('username', [validators.Length(min=3, max=50), validators.Required()])
email = TextField('email', [validators.Length(min=3, max=100), 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')
def email_unique(self, email):
if models.User.query.filter_by(email = email).first() != None:
self.email.errors.append('This E-mail address is already in use. Please choose another one.')
return False
vues:
#!flask/bin/python
from app import app, db, lm
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
from models import User
@app.route('/register', methods = ['GET', 'POST'])
def register():
form = RegisterForm()
#makes the username unique
u_unique = form.username.data
u_unique = User.unique_username(u_unique)
#validates email adress and checks if it already exists or not
form.email_unique(form.email.data)
if form.validate_on_submit():
user = User(
u_unique,
form.password.data,
form.email.data,
form.age.data,
form.about_user.data,
form.img_url.data)
db.session.add(user)
db.session.commit()
flash('Thank you for your registration')
flash('Your username is: ' + str(u_unique))
return redirect(url_for('login'))
else:
for error in form.errors:
flash(error)
return render_template('register.html',
title = 'Registeration',
form = form)
L'erreur est:
Traceback (most recent call last) File <br> "/home/maksad/Desktop/faskMonkey/flask/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__ return self.wsgi_app(environ, start_response)
File "/home/maksad/Desktop/faskMonkey/flask/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app response = self.make_response(self.handle_exception(e))
File "/home/maksad/Desktop/faskMonkey/flask/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app response = self.full_dispatch_request()
File "/home/maksad/Desktop/faskMonkey/flask/lib/python2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request rv = self.handle_user_exception(e)
File "/home/maksad/Desktop/faskMonkey/flask/lib/python2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request rv = self.dispatch_request()
File "/home/maksad/Desktop/faskMonkey/flask/lib/python2.7/site-packages/flask/app.py", line 1344, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args)
File "/home/maksad/Desktop/faskMonkey/app/views.py", line 92, in register form.email_unique(form.email.data)
File "/home/maksad/Desktop/faskMonkey/app/forms.py", line 26, in email_unique
self.email.errors.append('This E-mail address is already in use. Please choose another one.')
AttributeError: 'tuple' object has no attribute 'append'
OriginalL'auteur Max | 2014-04-06
Vous devez vous connecter pour publier un commentaire.
La
tuple
objets impossible d'ajouter des. Au lieu de cela, se convertir à une liste à l'aide delist()
, et ajouter, puis de les convertir en arrière, comme tel:Espérons que cette aide!
Heureux d'être de l'aide 🙂
Le wtforms états de documentation que
errors
une liste:errors: If validate encounters any errors, they will be inserted into this list.
C'était en tout cas la source de ma confusion.le détail ici, c'est que la Forme.valider() semble fixer les erreurs à une liste
Merci pour la signaler. Je me demandais pourquoi un changement dans le code (pas d'appel de valider plus) tout à coup se plaignait
errors
étant un tuple alors que précédemment était toujours une liste.OriginalL'auteur A.J. Uppal
tuples
sont immuables types qui signifie que vous ne pouvez pas épissure et de leur affecter des valeurs. Si vous allez travailler avec des types de données où vous en avez besoin pour ajouter des valeurs et de supprimer des valeurs, l'utilisation de la liste à la place:OriginalL'auteur sshashank124
Viens de tomber sur ce moi-même. Je pense qu'une meilleure réponse à votre question est que vous devez valider les éléments avant d'ajouter des erreurs. Le processus de validation définit l'erreur de champ à une liste et si vous les modifier avant de valider les champs, il sera écrit sur lorsque vous validez.
Afin de remplacer la méthode de validation de votre formulaire, appelez le parent méthode de validation puis exécutez votre email_unique méthode.
Ensuite, vous pouvez supprimer le email_unique de la vue, car il fera partie de votre validate_on_submit
OriginalL'auteur 24HourPhysicist
La réponse est un peu plus profond. "erreurs" est un tuple lorsque le Champ classe créée.
Mais lorsque la méthode de valider appelé, il le convertir en liste
Donc tout ce que vous avez besoin est juste d'appeler votre email_unique fonction juste après validate_on_submit, qui à tour de rôle l'appel de valider la fonction de la forme et de convertir des erreurs de liste
OriginalL'auteur Zaytsev Dmitry