在摆弄 wtforms 之后,字段使用小部件将它们实际呈现为 html。我写了一些自定义字段/小部件来以我更喜欢的方式绘制 html。但这里有一个问题:
假设我想用预定义的 css 类渲染它们或自己提供实际细节。
我怎样才能做到这一点?以及在处理请求的哪个阶段(在Form
类声明中?或在设置属性时给出Form
一些Fields
?或者当我实际上在 jinja2 模板中调用它们时)我应该这样做?
我使用类似这样的 Jinja 宏:
{% macro field_with_errors(field) %}
{% set css_class=kwargs.pop('class', '') %}
{% if field.type in ('DateField', 'DateTimeField') %}
{{ field(class='date ' + css_class, **kwargs) }}
{% elif field.type == 'IntegerField' %}
{{ field(class='number ' + css_class, **kwargs) }}
{% else %}
{{ field(class=css_class, **kwargs) }}
{% endif %}
{% if field.errors %}
<ul class="errors">{% for error in field.errors %}<li>{{ error|e }}</li>{% endfor %}</ul>
{% endif %}
{% endmacro %}
用法类似于:
{{ field_with_errors(form.foo, placeholder='bar') }}
这让我避免了样板,但也让我将显示决策保留在模板空间中。
查看渲染字段部分。
或者,您可以添加要在 Jinja2(等)模板中呈现的属性:
<div class="input-prepend">
{{ form.address(placeholder="example.com", id="address", autofocus="autofocus", required="required") }}
</div>
没有什么可以阻止您为上面的 ID 值使用变量,而不是address
,然后使用关键字参数呈现模板以填充它。