无法在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 %}