[英]embed raise ValidationError in wtform custom validation messages
我正在嘗試使用 wtf 驗證檢查 JSON 數據中是否已存在 useremail。 我制作了一個 function 來檢查用戶是否存在,但我遇到了引發 ValidatioError 的問題。 我想將它與 StringField 消息一起嵌入,例如,當提交表單而不放置數據時,它會出現類似此字段的錯誤,當用戶輸入已經存在的 email 時,需要以同樣的方式顯示錯誤消息
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 創建元組並將其添加到您的錯誤中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.