flask和wtf - 如何指定字段的标记属性?

时间:2013-02-06 15:53:06

标签: python flask wtforms

在摆弄wtforms之后,字段使用小部件将它们实际呈现为html。我写了一些自定义字段/小部件以我更喜欢的方式绘制html。但这是一个问题:

假设我想用预定义的css类渲染它们或者自己给出实际的细节。

我怎样才能做到这一点?以及处理请求的哪个阶段(在Form类声明?或设置属性以给Form一些Fields?或当我实际上在jinja2模板中调用它们时我应该做是什么?

2 个答案:

答案 0 :(得分: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') }}

这让我可以避免使用样板,但也可以让我在模板空间中保留显示决策。

答案 1 :(得分:2)

查看rendering fields部分。

或者,您可以添加要在Jinja2(等)模板中呈现的属性:

<div class="input-prepend">
        {{ form.address(placeholder="example.com", id="address", autofocus="autofocus", required="required") }}
</div>

没有什么可以阻止您使用变量作为上面的ID值,而不是address,然后使用关键字参数渲染模板来填充它。