Flask和WTF - 如何为字段设置标签属性?
在玩弄wtforms的时候,我发现字段是通过小部件来渲染成html的。我写了一些自定义的字段和小部件,以便以我更喜欢的方式来显示html。但是我有个问题:
假设我想用预定义的css类来渲染这些字段,或者自己提供一些具体的细节。
我该怎么做呢?在处理请求的哪个阶段(是在Form
类声明的时候?还是在给Form
设置属性以添加Fields
的时候?或者是在我实际在jinja2模板中调用它们的时候)我应该去做这个呢?
2 个回答
2
看看这个渲染字段的部分。
另外,你可以在Jinja2(等等)模板中添加要渲染的属性:
<div class="input-prepend">
{{ form.address(placeholder="example.com", id="address", autofocus="autofocus", required="required") }}
</div>
其实你可以用一个变量来代替上面提到的ID值,而不是直接用address
,然后通过关键字参数来渲染模板,把它填充进去。
3
我使用了一个类似这样的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') }}
这样做可以让我省去一些重复的代码,同时也能让我把显示的决定放在模板里。