鍍金池/ 問答/Python  網(wǎng)絡(luò)安全/ 這個(gè)宏哪里有錯(cuò)誤?我調(diào)試了半天,沒有摸到門道。希望知曉答案的大佬不吝賜教。

這個(gè)宏哪里有錯(cuò)誤?我調(diào)試了半天,沒有摸到門道。希望知曉答案的大佬不吝賜教。

這個(gè)是宏

{% macro printError(field, form) %}
{% if form.field.errors %}
<ul>
{% for error in form.field.errors %}
<li> {{ error }} </li>
{% endfor %}
</ul>
{% endif %}
{%- endmacro %}

這個(gè)是調(diào)用宏的地方

{% 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 %}

報(bào)錯(cuò)如下

jinja2.exceptions.UndefinedError: 'forms.LoginForm object' has no attribute 'field'

我的理解是jinja模板引擎把傳入的field直接代入到field的位置,但是這里看起來jinja在遇到form.field.errors時(shí)并沒有將field作為一個(gè)變量來對待。我嘗試用{{form.{{field}}.errors }}替換掉{{form.field.errors}}依然有錯(cuò)誤,我也覺得這樣更不像了,看起來很丑。
希望知道解決方法的同學(xué)可以詳細(xì)講一下jinja里面的宏機(jī)制和變量帶換規(guī)則,謝謝!

回答
編輯回答
苦妄

你這里是用錯(cuò)了。form.field實(shí)際上相當(dāng)于使用form['field']了,與你的參數(shù)field沒有什么關(guān)系??梢赃@樣用form[field]就行了。其實(shí)你上面代碼不需要這樣子用的,你只需要這樣字用:

{% macro printError(field) %}
{% if field.errors %}
<ul>
{% for error in field.errors %}
<li> {{ error }} </li>
{% endfor %}
</ul>
{% endif %}
{%- endmacro %}

<p> {{ printError(form.password) }} </p>
2017年7月24日 06:51