在构建基于Flask的小型Web应用程序时,我遇到了将表单字段对象中的任意数据传递到呈现它的模板的需求。但是,我似乎找不到办法做到这一点。
我认为我可以添加此类数据的唯一地方是kwargs
WTForms
对象的Field
属性,但后来我似乎无法从模板中访问这些属性。
如果你想知道我想要完成什么,我正在编写一个模板宏来简化表单渲染,我需要从Form
字段对象传递一些额外的数据 - 主要是布局相关,但不是HTML字段本身的属性(这是kwargs
的设计目的)。
我找到了答案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 %}