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

问题描述 投票:0回答:1

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

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

如果你想知道我想要完成什么,我正在编写一个模板宏来简化表单渲染,我需要从Form字段对象传递一些额外的数据 - 主要是布局相关,但不是HTML字段本身的属性(这是kwargs的设计目的)。

python flask flask-wtforms
1个回答
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 %}
© www.soinside.com 2019 - 2024. All rights reserved.