【问题标题】:Django custom tags not rendered (GAE)未呈现 Django 自定义标签 (GAE)
【发布时间】:2012-12-27 03:49:44
【问题描述】:

我正在尝试使用 Google App Engine 创建 Django 自定义标签,但由于某种原因,它始终无法正常工作。我相信我的标签已正确注册,因为 Django 正在解析它们,但渲染方法从未被调用。最奇怪的是,我的标签放在 for 循环 {% for ... %} 内时有效,但从不在外面。

代码如下:

在 django/mytags.py 中

from django import template
from google.appengine.ext import webapp

register = webapp.template.create_template_register()

# This works all the time
@register.simple_tag
def hello_world():
    return u'Hello world'

@register.tag('foo')
def foo(parser, token):
    return FooNode()

class FooNode(template.Node):
    def __init__(self):
        self.foo = 'foo'

    def render(self, context):
        return self.foo

在 main.py 中

from google.appengine.ext.webapp import template

template.register_template_library('django.mytags')

...

self.response.out.write(template.render('main.html', template_values))

在 main.html 中

{% foo %}

{% for item in items %}
    {% foo %}

结果:

<django.mytags.FooNode object at 0x000000001794BAC8>

foo
foo
foo
...

这让我发疯了。我怀疑将我的标签放在 for 循环中会强制渲染节点(应该已经完成​​)。

【问题讨论】:

  • 只是一个想法,但是如果你在FooNode 类中添加一个__unicode__() 函数呢?
  • @frb - 在这种情况下,添加 __unicode__() 只会隐藏问题。我需要使用上下文作为参数调用 render() 方法,以便能够做的不仅仅是返回一个字符串。
  • @nhuon:但我认为 render() 总是需要返回一个字符串(即使它是空的)?附:我不知道为什么会这样。似乎 __init__() 没有被调用。
  • @stellarchariot - 我的意思是我需要使用传递给 render() 调用的上下文来选择要返回的正确字符串。如果渲染的结果总是相同的,我想我不会用标签来打扰自己。至于 __init__(),它被调用,所以节点被创建但不被渲染。
  • 深入您的服务器并查看为实现 jsp 页面而自动生成的代码。它会在某个地方。阅读代码可能会解释发生了什么。

标签: python django google-app-engine


【解决方案1】:

你需要为你的类添加字符串表示

class FooNode(template.Node):
    def __init__(self):
        self.foo = 'foo'

    def render(self, context):
        return self.foo

    def __unicode__(self):
        return 'string to put in template'

【讨论】:

  • 现在可以正常使用字符串表示
  • 其实我还是有同样的问题。它适用于 for 循环,而不是外部。
【解决方案2】:

你不是忘了加{% load mytags %}吗? (应该使用,根据custom tag docs

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2013-10-18
    相关资源
    最近更新 更多