将任意数据从FlaskForm对象传递到模板

时间:2019-02-26 13:51:01

标签: python flask flask-wtforms

在构建一个基于Flask的小型Web应用程序时,我遇到了将任意数据从“表单域”对象传递到正在呈现它的模板的需求。但是,我似乎找不到办法。

我认为我可以添加此类数据的唯一地方是kwargs WTForms对象的Field属性,但是那时我似乎无法从模板访问这些属性

如果您想知道我要完成的工作,请编写模板宏以简化表单呈现,并且需要从Form字段对象传递一些额外的数据-大多数与布局有关,但不会是字段本身的HTML属性(这是kwargs设计的目的)。

1 个答案:

答案 0 :(得分:0)

我找到了答案here,但这本身不是答案,但我发表了意见。

引用Crast

  

允许在构造字段时设置WTForms字段的description关键字参数,并且不对其进行检查,只需将其直接复制到该字段即可,因此可以是任何值,而不仅仅是字符串,甚至可以是自定义属性。如果要保留自己的元数据,则可以简单地使用它来保留您想要的任何数据:TextField(..., description={'placeholder': foo', 'class': bar}(甚至是一个自定义类),然后在模板中将此属性用于所需的任何特殊元数据。

是的,我知道有关分隔内容和表示形式的问题,description属性的用途并不是真正用于这种用途的,但这是我发现将数据传回模板的唯一途径使用宏来呈现表单。

要从模板访问description内部的传递数据,我做了如下操作:

{% macro render_create_form(form, form_title, enctype=None) %}
  <h2>{{ form_title }}</h2>
  <form action="" method="post"{% if enctype %} enctype="{{ enctype }}"{% endif %}>
  {{ form.hidden_tag() }}
    {% for field in form if not field.name == 'csrf_token' %}
      {% set class_name = field.description.class %}
      {% if field.type == "StringField" or field.type == "PasswordField" or field.type == "BooleanField" or field.type == "SelectField" %}
        <div class="{{ class_name }}">{{ field.label }} {{ field }}</div>
      {% elif field.type == "NumberField" %}
        <div class="{{ class_name }}">{{ field.label }} {{ field(type='number', min=field.description.min, max=field.description.max, placeholder=field.description.placeholder) }}</div>
      {% elif field.type == "HiddenField" %}
        {{ field }}
      {% elif field.type == "SubmitField" %}
        <div class="{{ class_name }}">{{ field }}</div>
      {% endif %}
  {% endfor %}
  </form>
{% endmacro %}