【问题标题】:WTForms render_field() method reference for-loop variablesWTForms render_field() 方法参考for循环变量
【发布时间】:2018-08-03 23:17:41
【问题描述】:

我正在使用 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

【问题讨论】:

  • 为什么不{% for field in form %}{{ render_field(field) }}{% endfor %}?您是否正在尝试处理与表单中的字段不匹配的 categories
  • @snakecharmerb 我遇到的问题是form.category 被读取,好像变量form 有一个名为category 的属性。但是,我希望 category 的值是基于 for 循环的值。这有意义吗?

标签: python validation flask jinja2 wtforms


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    是的:

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

    【讨论】:

    • 我很抱歉,我认为我没有说清楚。我需要访问表单属性form.category1form.category2。我刚刚用更多信息更新了这个问题,希望能更清楚。尝试传入(category) 只是传入一个字符串而不是表单属性。
    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2013-06-12
    • 2017-06-20
    相关资源
    最近更新 更多