簡體   English   中英

在 wtform 自定義驗證消息中嵌入 raise ValidationError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM