WTForms render_field() 方法参考 for 循环变量

WTForms render_field() method reference for-loop variables

我正在使用 Flask 创建网络应用程序。我正在尝试通过遍历 render_template() 方法中传递的列表来使用 Flask-WTForms 创建表单。但是,我无法在模板内的 for 循环中引用变量。

查看

class FormExample(Form):
    category1 = StringField("Category 1")
    category2 = StringField("Category 2")

categories = ['category1', 'category2']
def form():
    form = FormExample(request.form)
    return_template("form.html", categories=categories, form=form)

_formhelpers.html(建议在docs下使用)

{% macro render_field(field) %}
  <dt>{{ field.label }}
  <dd>{{ field(**kwargs)|safe }}
  {% if field.errors %}
    {% for error in field.errors %}
      {{ error }}
    {% endfor %}
  {% endif %}
  </dd>
{% endmacro %}

模板 (form.html)

<form method="POST">
  {% for category in categories %}
    {{render_field(form.category)}}
  {% endfor %}
</form>

form.html 中尝试引用 form.category 时,我通过 Flask 调试器收到以下错误:

jinja2.exceptions.UndefinedError: '__main__.EvaluateCaseForm object' has no attribute 'category'

我已经查看了官方文档here,但找不到答案。我还尝试引用 {{render_field({{ form.category }})}}{{render_field(form.{{category}})}}{{render_field({% form.category %})}}

有没有办法在 render_field() 方法中引用 for 循环变量 category

Is there a way to reference the for-loop variable category inside the render_field() method?

对:

   {% for category in categories %}
     {{render_field(category)}}
   {% endfor %}

WTForms 使用 __getitem__ protocol to allow fields can be accessed like dictionary values,例如 form[fieldname]

因此,在您的代码中,将 form.category 替换为 form[category]:

<form method="POST">
  {% for category in categories %}
    {{ render_field(form[category]) }}
  {% endfor %}
</form>