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

时间:2018-08-03 23:17:42

标签: python validation flask jinja2 wtforms

我正在使用Flask创建一个Web应用程序。我正在尝试通过遍历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.category中尝试引用form.html时,通过Flask调试器给出了以下错误:

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

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

是否可以在category方法内引用for循环变量render_field()

2 个答案:

答案 0 :(得分:1)

WTForms使用__getitem__协议来允许像dictionary values这样的字段可以访问,例如form[fieldname]

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

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

答案 1 :(得分:0)

  

是否可以在render_field()方法中引用for循环变量类别?

是的

array.get