这个是宏
{% macro printError(field, form) %}
{% if form.field.errors %}
<ul>
{% for error in form.field.errors %}
<li> {{ error }} </li>
{% endfor %}
</ul>
{% endif %}
{%- endmacro %}
这个是调用宏的地方
{% block body %}
{% from 'errorMacro.html' import printError %}
<form method="POST" action={{ url_for(".login") }}>
{{ form.csrf_token }}
{{ form.username.label }} {{ form.username(size=32, placeholder="Username") }}
<p> {{ printError('username', form) }} </p>
{{ form.password.label }} {{ form.password(size=32, placeholder="Password") }}
<p> {{ printError('password', form) }} </p>
<button type="submit">Login</button>
</form>
{% endblock %}
报错如下
jinja2.exceptions.UndefinedError: 'forms.LoginForm object' has no attribute 'field'
我的理解是jinja模板引擎把传入的field直接代入到field的位置,但是这里看起来jinja在遇到form.field.errors时并没有将field作为一个变量来对待。我尝试用{{form.{{field}}.errors }}替换掉{{form.field.errors}}依然有错误,我也觉得这样更不像了,看起来很丑。
希望知道解决方法的同学可以详细讲一下jinja里面的宏机制和变量带换规则,谢谢!
你这里是用错了。form.field实际上相当于使用form['field']了,与你的参数field没有什么关系。可以这样用form[field]就行了。其实你上面代码不需要这样子用的,你只需要这样字用: