首页 > 解决方案 > 在 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)

标签: pythonflaskjinja2flask-wtforms

解决方案


你很亲密。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 创建元组并将其添加到您的错误中。


推荐阅读