Рендеринг WTForms CheckboxInput в шаблоне Jinja

Я не могу понять, как визуализировать WTForms CheckboxInput в моем шаблоне. Когда я пытаюсь отобразить поле с помощью Flask в моем шаблоне Jinja, я получаю эту ошибку:

TypeError: call() принимает ровно 2 аргумента (дан 1)

Ошибка связана с тем, как {{ form.prefs(value='n') }} используется в моем шаблоне. В документации WTForms для CheckBoxInput говорится: "Значение = HTML атрибут по умолчанию равен 'y', если иное не указано значением = при рендеринге." Я получаю сообщение об ошибке независимо от того, указываю ли я значение или нет.

Кажется, я не могу найти пример того, как отображать простой 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 %}

person Raj    schedule 14.05.2013    source источник


Ответы (2)


Фактически вы должны использовать BooleanField вместо прямого использования виджета:

class PreferencesForm(Form):
    prefs = BooleanField()

И затем в вашем шаблоне:

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

Общая идея заключается в использовании одного из fields в вашем классе формы, который автоматически назначит правильный виджет для отображения. И виджеты:

... классы, целью которых является отображение поля в его пригодном для использования представлении, обычно XHTML. Когда вызывается поле, поведение по умолчанию заключается в делегировании рендеринга его виджету. Эта абстракция предоставляется для того, чтобы можно было легко создавать виджеты для настройки отображения существующих полей.

выделено мной

Кроме того, виджету требуется экземпляр поля для рендеринга:

def __call__(self, field, **kwargs):
    if getattr(field, 'checked', field.data):
        kwargs['checked'] = True
    return super(CheckboxInput, self).__call__(field, **kwargs)
person bool.dev    schedule 14.05.2013
comment
Ах! Извините, мне не было ясно, что я не должен был использовать виджеты напрямую. Спасибо так любезно! - person Raj; 15.05.2013

использовать проверенный 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 %}
person Luis Garcia    schedule 23.05.2015