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