在Jinja模板中渲染WTForms CheckboxInput

Raj*_*Raj 2 jinja2 flask wtforms flask-wtforms

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

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

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

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

这是我的表格:

class PreferencesForm(Form):
    prefs = widgets.CheckboxInput()
Run Code Online (Sandbox Code Playgroud)

这是我的模板:

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

boo*_*dev 7

实际上你应该使用a BooleanField而不是直接使用widget:

class PreferencesForm(Form):
    prefs = BooleanField()
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中:

{{ form.prefs(value='n') }}
Run Code Online (Sandbox Code Playgroud)

一般的想法是使用表单类中的一个字段,它将自动分配适当的窗口小部件以供显示.和小部件:

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

强调我的

此外,窗口小部件需要字段实例来呈现自身:

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