python - 在 wtform 自定义验证消息中嵌入 raise ValidationError
问题描述
我正在尝试使用 wtf 验证检查 JSON 数据中是否已存在 useremail。我做了一个检查用户是否存在的函数,但我遇到了 raise ValidatioError 的问题。我想将它与 StringField 消息一起嵌入,例如,当提交表单而不放置数据时,它会出现类似此字段的错误,当用户输入已经存在的电子邮件时,它需要以同样的方式显示错误消息
flash 为我工作,但我想将它与 StringFields 错误一起嵌入
我试过了
def check_user(self,email):
"""User name check in data base"""
if email != users:
raise ValidationError('Email already registered.')
哪些工作但会使应用程序崩溃
def check_user(self,email):
"""User name check in data base"""
if email != users:
self.email.errors.append("Email already registered")
不显示任何错误或反馈
这是完整的文件
form.py
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo,ValidationError
import json
from flask import redirect,request, url_for, flash
class RegistrationForm(FlaskForm):
username = StringField('Username',
validators = [
DataRequired(message=('Please enter your name!')),
Length(min=3, max=20)
])
email = StringField('Email',
validators = [
DataRequired(message=('Please enter email address!')),
Email(),
Length(min=6)
])
password = PasswordField('Password',
validators = [
DataRequired(message=('Please enter the password')),
Length(min=6,max=20),
])
submit = SubmitField('Sign Up')
# function which check the user already exist in database
def user_already_exit(self, email):
"""Email validation."""
user = User.query.filter_by(email=email.data).first()
if user is not None:
raise ValidationError('Please use a different email address.')
users = {
"aheer": {
"username": "aheer",
"email": "aheer@gmail.com",
"password": "example",
"bio": "Some guy from the internet"
},
"majid": {
"username": "majid",
"email": "clarissa@icloud.com",
"password": "example",
"bio": "Sweet potato is life"
}
}
class LoginForm(FlaskForm):
def check_user(self,email):
"""User name check in data base"""
if email != users:
raise ValidationError('Email already registered.')
email = StringField('Email',
validators = [
DataRequired(message=('Please enter email address!')),
Email(),
Length(min=6)
])
password = PasswordField('Password',
validators = [
DataRequired(message=('Please enter the password')),
Length(min=6,max=20),
])
remember = BooleanField('Remember Me')
submit = SubmitField('Login')
login.html
{% extends "public/templates/public_template.html" %}
{% import "macros/input_macros.html" as im %}
{% block title %} User Login {% endblock %}
{% block main %}
<div class="container">
<div class="row justify-content-center align-items-center pt-3 pb-3">
<div class="col-4">
<div class="card">
<div class="card-body">
<h4 class="text-center">Welcome Back!</h4>
<hr>
<form action="" method="post" novalidate>
{{ form.hidden_tag() }}
<div class="form-group">
{{ im.input(form.email.label) }}
{% if form.email.errors %}
{{ im.input(form.email,placeholder='aheer@gmail.com',class="form-control is-invalid") }}
{% else %}
{{ im.input(form.email,placeholder='aheer@gmail.com',class="form-control") }}
{% endif %}
</div>
<div class="form-group">
{{ im.input(form.password.label) }}
{% if form.password.errors %}
{{ im.input(form.password,class="form-control is-invalid") }}
{% else %}
{{ im.input(form.password,class="form-control") }}
{% endif %}
</div>
<div class="form-check form-check-inline">
{{ form.remember(class="form-check-input") }}
{{ form.remember.label(class="form-check-label") }}
</div>
<div class="form-group">
<input type="submit" class="btn btn-warning btn-block" name="submit" value="Next">
</div>
<hr>
<p class="text-center">Don't have an account ? <a class="ml-1" href="{{ url_for('register') }}">Sign Up</a></p>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
view.py
@app.route("/login", methods=["GET", "POST"])
def login():
get_user_input = request.form
form = LoginForm(get_user_input)
if request.method == "POST" and form.validate_on_submit():
if form.check_user(form.email.data):
flash(f'Welcome {form.email.data}!', 'success')
return redirect(url_for('index'))
else:
user = users[form.email.data]
# if request.method == "POST":
# get_user_input = request.form
# username = get_user_input.get("name")
# password = get_user_input.get("password")
#
# if not username in users:
# print("Username not found")
# return redirect(request.url)
# else:
# user = users[username]
#
# if not password == user["password"]:
# print("Incorrect password")
# return redirect(request.url)
# else:
# session["USERNAME"] = user["username"]
# print("session username set")
# return redirect(url_for('admin'))
return render_template("public/login.html",form=form)
解决方案
你很亲密。self.email.errors
是验证错误的元组。所以你应该这样做:
from wtforms import ValidationError
...
def check_user(self,email):
"""User name check in data base"""
if email != users:
self.email.errors += (ValidationError("Email already registered"),)
它从单个 ValidationError 创建元组并将其添加到您的错误中。
推荐阅读
- jquery - 计数项目并在元素 Jquery 中显示字符串
- java - XPATH 结果为空字符串
- angular - 从 2 个根页面导航,每个都有显示 2 个不良行为的选项卡
- oracle - 在 Oracle 上使用 Dapper 进行简单插入
- regex - 如何匹配多种语言
- java - 绘制自定义视图并调整其大小以适应屏幕大小
- jestjs - vue test utils SyntaxError: Unexpected token import
- cucumber - Cucumber JVM:如何从带有场景大纲的钩子中的示例部分访问数据?
- django - ip地址的SSL证书[Nginix+django服务器]
- php - 我想在 wordpress 的同一页面上过滤类别明智的帖子