0

我正在(使用 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使用重复的用户名电子邮件地址测试它时,它根本不会显示任何错误(也不会将任何用户添加到数据库中,这没关系)。但是当我输入任何错误的电子邮件将任何字段留空时,它会显示相应error的,但不会显示error我想使用register视图传递的内容。

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

以及为什么它的显示errors与空白字段或错误有关,email但与我尝试传递的重复项无关username

请建议。

4

2 回答 2

2

好吧,你做错了:)

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

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

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

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

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

于 2013-04-06T23:43:48.060 回答
0

您可以像这个示例代码文件一样闪烁错误: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 %}
于 2015-03-23T19:12:03.630 回答