无法在Jinja2模板中显示自定义错误消息

问题描述:

我正在写一个注册用户函数(使用Flask,Python,Jinja2),我正在检查用户名(或电子邮件)是否已经存在,如果显示错误到TextField下面。无法在Jinja2模板中显示自定义错误消息

寄存器的代码是:

@app.route('/register', methods=['GET', 'POST']) 
def register(): 
    form = SignupForm() 
    error = None 
    if form.validate_on_submit(): 
     user_by_name = Users.query.filter_by(username=form.username.data).first() 
     user_by_email = Users.query.filter_by(email=form.email.data).first() 
     if user_by_name: 
     error = 'Username already taken. Choose another' 
     return render_template('register.html', form=form, error = error) 
     elif user_by_email: 
     error = 'Email already registered. Login or register with another Email' 
     return render_template('register.html', form=form, error = error) 
     else: 
     #Add user details to DB logic 
      return redirect(url_for('index')) 
    return render_template('register.html', form=form, error = error) 

我有一个文件util.html

{% macro render_field(field) %} 
    <div class="control-group {% if field.errors %}error{% endif %}"> 
     {% if kwargs.get('label', True) %} 
      {{ field.label(class="control-label") }} 
     {% endif %} 
     <div class="controls"> 
      {{ field(**kwargs) }} 
      {% for error in field.errors %} 
       <p class="help-block">{{ error }}</p> 
      {% endfor %} 
     </div> 
    </div> 
    {% endmacro %} 

限定的并使用该register.html为:

{% from "util.html" import render_field %} 

{% extends "base.html" %} 

{% block content %} 
    <form method="post"> 
     {{ form.hidden_tag() }} 
     {{ render_field(form.username, label=True, class="input-xlarge", autofocus="autofocus", errors=error) }} 
     {{ render_field(form.password, label=True, class="input-xlarge", autofocus="autofocus") }} 
     {{ render_field(form.confirm, label=True, class="input-xlarge", autofocus="autofocus") }} 
     {{ render_field(form.email, label=True, class="input-xlarge", autofocus="autofocus", errors=error) }}   

     <button class="btn" type="submit">Register</button> 
    </form> 
{% endblock %} 

现在,当我测试localhost:5000/register与重复用户名电子邮件地址它不显示任何错误(也没有添加任何用户到数据库这是好的)。 但是,当我输入任何错误的电子邮件留空任何领域它显示了各自的error,但没有表现出我想用register视图传递error

是否有任何Jinja2相关逻辑丢失?

为什么它显示errors相关领域的空白或错误​​email但不是我试图通过对重复username

请建议。

那么,你就错了:)

{% for error in field.errors %} 
     <p class="help-block">{{ error }}</p> 
{% endfor %} 

错误此宏搜索在各自field.errors

但你传递错误上下文变量,它没有连接到外地。

解决此问题的正确方法是将def validate_user添加到您的表单定义并检查其中的所有内容。
如果它出错 - >提高ValidationError(消息)
看到这里例如: WTForms documentation

通过这种方法,您validate_on_submit(),如果它没有被确认不应该返回True。

你可以只闪光的错误这样 示例代码 文件:views.py

@app.route('/') 
def index(): 
    # some checks which provided error   
    if error: 
     flash(error) 
    return render_template('template.html') 

文件template.html

{% for category, msg in get_flashed_messages(with_categories=true) %} 
    <div class="category">{{ msg|safe }}</div> 
{% endfor %}