Ярлыки форм не отображаются с помощью Django & WTForms - PullRequest
1 голос
/ 18 мая 2011

Я пытаюсь использовать 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. Метка существует в представлении, я могу напечатать ее на консоли, и она показывает визуализированную метку формы, но каким-то образом она теряется при передаче в шаблон. Я что-то не так делаю?

Ответы [ 2 ]

1 голос
/ 02 августа 2012

В 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 %}
0 голосов
/ 30 ноября 2011

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

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

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

  • templatetags
  • templatetags / init .py
  • templatetags / templatetags
  • templatetags / templatetags / init .py
  • templatetags / templatetags / 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 %}

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

...