Flask和WTF - 如何为字段设置标签属性?

1 投票
2 回答
3043 浏览
提问于 2025-04-17 14:59

在玩弄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') }}

这样做可以让我省去一些重复的代码,同时也能让我把显示的决定放在模板里。

撰写回答