在Jinja模板中渲染WTForms CheckboxInput

时间:2013-05-14 20:24:02

标签: flask jinja2 wtforms flask-wtforms

我似乎无法弄清楚如何在模板中渲染WTForms CheckboxInput。当我尝试使用我的Jinja模板中的Flask渲染字段时,我收到此错误:

TypeError:调用()只需要2个参数(给定1个)

该错误与我的模板中{{ form.prefs(value='n') }}的使用方式有关。 CheckBoxInput的WTForms文档说“默认情况下,value = HTML属性为'y',除非在渲染时由value =另行指定。”无论是否指定值,我都会收到错误。

我似乎无法找到如何呈现简单的CheckBoxInput的示例。任何帮助表示赞赏。

这是我的表格:

class PreferencesForm(Form):
    prefs = widgets.CheckboxInput()

这是我的模板:

{% extends "base.html" %}

{% block content %}

<form method="POST" action="/user/prefs/">
    <div>{{ form.prefs(value='n') }}</div>
    <button type="submit" class="btn">Submit</button>    
</form>

{% endblock %}

2 个答案:

答案 0 :(得分:7)

您实际上应该使用BooleanField而不是直接使用小部件:

class PreferencesForm(Form):
    prefs = BooleanField()

然后在你的模板中:

{{ form.prefs(value='n') }}

一般的想法是在表单类中使用fields之一,它会自动分配适当的小部件进行显示。 widgets are

  

... 的目的是将字段呈现给其可用的表示形式,通常是XHTML。调用字段时,默认行为是将呈现委托给其窗口小部件。提供此抽象以便可以轻松创建窗口小部件以自定义现有字段的呈现。

强调我的

此外,小部件本身需要field instance to render

def __call__(self, field, **kwargs):
    if getattr(field, 'checked', field.data):
        kwargs['checked'] = True
    return super(CheckboxInput, self).__call__(field, **kwargs)

答案 1 :(得分:0)

使用checked att

{% if r.renovacion == 's' %}
        <td>{{  forma.renovacion(id = "" + r.id|string  + "", value = 's', checked = True) }}</td>
        {% else %}
        <td>{{  forma.renovacion(id = "" + r.id|string  + "", value = 'n', checked = False) }}</td>
        {% endif %}