【发布时间】:2019-04-30 17:14:22
【问题描述】:
由于某种原因,我的 wtf 表单似乎无法验证。当表单使用已经存在的用户名完成并且我按下提交时,页面保持在原处并且不会引发验证错误,尽管在代码中。具有新用户名的用户可以很好地添加到数据库中。
希望有人可以将代码复制/粘贴到文本编辑器中并让它运行:
这是表格:
class RegistrationForm(FlaskForm):
username = StringField('Username', validators = [DataRequired()])
password = PasswordField('Password', validators = [DataRequired()])
submit = SubmitField('Register')
def validate_username(self,field):
if UserRegistration.query.filter_by(username=field.data).first():
raise ValidationError('Your username has been registered already!')
这是模型类:
class UserRegistration(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.Text, unique=True, index=True)
password_hash = db.Column(db.Text(128))
def __init__(self, username, password):
self.username = username
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
def __repr__(self):
return f"Username {self.username}"
这是视图:
@users.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
username = form.username.data
password = form.password.data
user = UserRegistration(username, password)
db.session.add(user)
db.session.commit()
flash(f'Thanks for registering! Your credentials are: Username: {username}, Password: {password}')
return redirect(url_for('users.all_users'))
return render_template('register.html', form=form)
这是表单所在的 html 文档:
{% extends 'base.html' %}
{% block content %}
<div class="container col-md-8 col-md-offset-2">
<h1>Registration Form</h1> <br>
<form method="POST">
{{form.hidden_tag()}}
<div class="form-group">
{{form.username.label()}}
{{form.username(class='form-control form-text text-muted')}}
</div>
<div class="form-group">
{{form.password.label()}}
{{form.password(class='form-control form-text text-muted')}}
</div>
<div class="form-group">
{{form.submit(class="btn btn-primary")}}
</div>
</form>
</div>
{% endblock %}
【问题讨论】:
-
如果您怀疑验证存在问题,请打印/刷新/记录
form.errors字典。 -
顺便说一句,您的
username和email设置了unique=True,因此如果表单提交重复值,则可能值得错误捕获UniqueKeyConstraintError,而不是验证表单.维护的代码更少,并且可能涵盖更多的基础......只是一个想法
标签: python flask flask-sqlalchemy flask-wtforms wtforms