我正在编写一个注册用户函数(使用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
等。
请建议。
答案 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 %}