【问题标题】:unable to show custom error message in Jinja2 template无法在 Jinja2 模板中显示自定义错误消息
【发布时间】:2015-03-24 03:12:03
【问题描述】:

我正在(使用 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 %}

现在,当我使用重复的 usernameemail 地址测试 localhost:5000/register 时,它根本不会显示任何错误(也不会将任何用户添加到 DB没关系)。 但是当我输入任何错误的电子邮件将任何字段留空时,它会显示相应的error,但没有显示我想使用register视图传递的error .

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

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

请提出建议。

【问题讨论】:

    标签: python html flask jinja2


    【解决方案1】:

    好吧,你做错了:)

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

    此宏在相应的 field.errors 中搜索错误

    但是您传递了错误上下文变量,该变量未附加到该字段。

    解决此问题的正确方法是将def validate_user 添加到您的表单定义中并检查其中的所有内容。
    如果出错 -> 引发 ValidationError(message)
    请参见此处的示例: WTForms documentation

    使用这种方法,如果未验证,您的 validate_on_submit() 不应返回 True。

    【讨论】:

      【解决方案2】:

      你可以像这样闪现错误 示例代码 文件:views.py

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

      文件模板.html

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        • 2020-08-11
        相关资源
        最近更新 更多