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

时间:2013-04-06 15:58:07

标签: python html flask jinja2

我正在编写一个注册用户函数(使用Flask,Python,Jinja2),我正在检查用户名(或电子邮件)是否已经存在,如果是,则显示错误到TextField下面。

注册码是:

@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时,它根本不会显示任何错误(也不会添加任何用户)进入DB,这没关系)。 但是,当我输入任何错误的电子邮件将任何字段留空时,它会显示相应的error,但不显示我想要传递的error register查看。

是否缺少与Jinja2相关的逻辑?

为什么它显示errors与空白字段或错误email相关但不是我尝试传递重复username等。

请建议。

2 个答案:

答案 0 :(得分:1)

嗯,你这样做错了:)

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

此宏在各个field.errors中搜索错误

但是你传递了错误上下文变量,它没有附加到字段。

解决此问题的正确方法是在表单定义中添加def validate_user并检查其中的所有内容。
如果出错 - &gt;提出ValidationError(消息)
见这里的例子: WTForms documentation

使用此方法,如果未验证validate_on_submit(),则不应返回True。

答案 1 :(得分:0)

您可以像这样闪烁错误 示例代码 file:views.py

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

file template.html

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