Метки форм не отображаются с помощью Django и WTForms

Я пытаюсь использовать WTForms с Django и базой данных MongoEngine/MongoDB. Формы выводятся правильно, но я не могу заставить метки отображаться.

Вот мой код шаблона:

{% load wtforms %}
<form>
    {% for f in form %}
        {{ f.label }}: {% form_field f %}<br/>
    {% endfor %}
</form>

Это то, что я передаю в представлении:

form = StrandForm()
return render_to_response('create_strand.html', locals(), context_instance = RequestContext(request))

Класс StrandForm, который я пробовал создавать как из класса model_form расширения WTForm mongoengine, так и из класса Form WTForm. Ярлык есть в представлении, я могу его распечатать в консоль и он показывает отрендеренную метку формы, но как-то теряется при переносе в шаблон. Я делаю что-то неправильно?


person Matthias    schedule 17.05.2011    source источник


Ответы (2)


В Django 1.4 появилась новая функция: атрибут do_not_call_in_templates.

Если вы установите его для класса wtforms.Field, каждый дочерний класс наследуется, и все поля будут нормально работать в шаблонах django.

import wtforms
wtforms.Field.do_not_call_in_templates = True

Теперь следующий код работает как положено:

{% load wtforms %}
{{ f.label }}: {% form_field f %}
person Ski    schedule 02.08.2012
comment
Это устранило проблему, когда я определил nested_form = FormField(...) в своей форме, а в шаблоне: {% form_field form.nested_form.nested_field %} не отображался, пока я не сделал wtforms.Field.do_not_call_in_templates = True. Спасибо. - person atp; 17.11.2012

Я столкнулся с той же проблемой сегодня. Это связано с тем, как запрограммирован WTForms, так что он будет работать со многими различными библиотеками шаблонов. Django 1.3 будет видеть только f как строку HTML, даже если у нее есть другие атрибуты.

Чтобы исправить это, вы должны добавить тег шаблона для получения атрибута.

Добавьте в иерархию проектов следующее:

  • шаблонтеги
  • теги шаблона / инициализация.py
  • теги шаблона / теги шаблона
  • теги шаблона / теги шаблона / инициализация.py
  • теги шаблона / теги шаблона / getattribute.py

Затем в файле settings.py добавьте следующую строку в INSTALLED_APPS.

'templatetags',

Откройте getattribute.py и вставьте следующий код:

from django import template
from django.conf import settings

register = template.Library()

@register.tag
def getattribute(parser, token):
    try:
        tag_name, tag_object, tag_function = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError("%r tag requires two arguments" % token.contents.split()[0])
    return getattrNode(tag_object, tag_function)

class getattrNode(template.Node):
    def __init__(self, tag_object, tag_function):
        self.tag_object = tag_object
        self.tag_function = tag_function
    def render(self, context):
        return getattr(context[self.tag_object], self.tag_function)()

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

{% load getattribute %}
{% getattribute OBJECT ATTRIBUTE %}

В твоем случае:

{% getattribute f label %}

Надеюсь, это помогло!

person MatthewKremer    schedule 29.11.2011