【发布时间】: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