【发布时间】: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 %}
现在,当我使用重复的 username 或 email 地址测试 localhost:5000/register 时,它根本不会显示任何错误(也不会将任何用户添加到 DB没关系)。
但是当我输入任何错误的电子邮件或将任何字段留空时,它会显示相应的error,但没有显示我想使用register视图传递的error .
是否缺少任何与 Jinja2 相关的逻辑?
以及为什么它显示errors 与空白字段或错误email 相关,但不是我试图传递重复的username 等。
请提出建议。
【问题讨论】: