使用 Flask + Flask-Classy + WTForms,我正在尝试实现一个路由,这样,当用户在输入表单时出现错误时,应用程序将再次向用户呈现该表单,并完成用户已经填写的内容。这样,用户不必担心再次输入所有表单输入:(s)他可以更正错误。
这些是我的类 UserView(FlaskView) 的代码,这是一个 flask-classy 类:
def post(self):
form = forms.UserForm(request.form)
if form.validate():
if form.id.data=='':
user = models.Users()
form.populate_obj(user)
user.id = None
db.session.add(user)
else:
user = models.Users.query.get(form.id.data)
form.populate_obj(user)
db.session.commit()
return redirect(url_for('UserView:index'))
else:
return redirect(url_for('UserView:validation_error', error_form=form))
def validation_error(self, error_form):
return render_template('users/form.html', form=error_form)
您可以看到,在这次尝试中,我尝试创建另一个方法:validation_error
,其参数——在我的期望中——应该包含所有表单数据。但是,我得到了 Jinja2 异常,UndefinedError: 'unicode object' has no attribute 'hidden_tag'
。当我检查它时,在进入 validation_error
之后,form
对象从 UserForm
稍微改变为某种 unicode
对象。
有什么建议吗?还是我试图以错误的方向解决这个问题?
编辑 1:详细说明如何显示错误
@Rawrgulmuffins 添加了关于如何显示错误的答案 inline (我认为这是最好的方法,因为页面不会跳动),在这里我将代码粘贴到列出所有错误的 layout.html
中。它可能不如内联错误显示好,但我认为这是最简单的方法。首先我为表单对象做一个 if ,因为这段代码也存在于所有页面(我可能会进一步重构它)
{% if form %}
{% for error in form.errors %}
<div class="alert alert-error">
<a class="close" data-dismiss="alert">×</a>
<strong>{{ form[error].label }} {{form.errors[error][0] }}</strong>
</div>
{% endfor %}
{% endif %}
屏幕截图:
最佳答案
我添加了我的答案,以扩展 swdev 的答案,适用于任何不明白他为什么只能渲染模板并显示错误的人。
表单中的每个字段都包含一个错误属性,该属性将在验证后(在 form.validate()
之后)填充。这些错误将包含在表单对象中。所以你可以这样说,
{% if field.errors %}
<span class="error help-inline">{{ field.errors|join(', ') }}</span>
{% endif %}
example source file .这非常漂亮,因为你可以说
return render_template('users/form.html', form=form)
如果是第一次呈现,则获得无错误表单,并仅在第二次呈现表单时显示错误。
我不确定为什么 Swdev 尝试重定向表单导致它现在被操纵。我现在正在查看 Werkzeug 代码,看是否能找到答案。
关于python - 重新呈现包含错误的表格的技术是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19152471/