【问题标题】:Form labels not rendering with Django & WTForms表单标签不使用 Django 和 WTForms 呈现
【发布时间】:2011-08-27 14:42:12
【问题描述】:

我正在尝试将 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))

我尝试从 WTForm mongoengine 扩展的 model_form 类和 WTForm 的 Form 类创建 StrandForm 类。标签存在于视图中,我可以将其打印到控制台并显示呈现的表单标签,但不知何故在传输到模板时它会丢失。我做错了吗?

【问题讨论】:

    标签: django mongoengine wtforms


    【解决方案1】:

    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 %}
    

    【讨论】:

    • 这解决了我在表单和模板中定义nested_form = FormField(...) 的问题:{% form_field form.nested_form.nested_field %} 直到我做了wtforms.Field.do_not_call_in_templates = True 才会出现。谢谢。
    【解决方案2】:

    我今天遇到了同样的问题。它与 WTForms 的编程方式有关,因此它可以与许多不同的模板库一起使用。 Django 1.3 只会将 f 视为 HTML 字符串,即使它具有其他属性。

    为了解决这个问题,您必须添加一个模板标签来检索属性。

    将以下内容添加到您的项目层次结构中:

    • 模板标签
    • 模板标签/init.py
    • 模板标签/模板标签
    • 模板标签/模板标签/init.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 %}
    

    希望有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      相关资源
      最近更新 更多