我試圖用Google App Engine創建Django自定義標記,但由於某些原因,它始終無法工作。我相信我的標籤正確地註冊爲Django解析它們,但渲染方法永遠不會被調用。最奇怪的是,我的標籤放置在for循環{%for ...%}內時工作,但從不在外面。Django自定義標記未呈現(GAE)
下面的代碼:
在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循環中強制節點被渲染(它應該已經完成)。
只是一個想法,但如果你添加一個'__unicode __()'函數到'FooNode'類? –
@frb - 在這種情況下添加__unicode __()將會隱藏問題。我需要使用上下文作爲參數來調用render()方法,以便能夠做的不僅僅是返回一個字符串。 – nhuon
@nhuon:但我認爲render()總是需要返回一個字符串(即使它是空的)?附:我不知道爲什麼會發生這種情況。看起來__init __()沒有被調用。 – stellarchariot