2013-01-12 134 views
9

我試圖用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循環中強制節點被渲染(它應該已經完成​​)。

+0

只是一個想法,但如果你添加一個'__unicode __()'函數到'FooNode'類? –

+0

@frb - 在這種情況下添加__unicode __()將會隱藏問題。我需要使用上下文作爲參數來調用render()方法,以便能夠做的不僅僅是返回一個字符串。 – nhuon

+0

@nhuon:但我認爲render()總是需要返回一個字符串(即使它是空的)?附:我不知道爲什麼會發生這種情況。看起來__init __()沒有被調用。 – stellarchariot

回答

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' 
+0

現在可以正常使用字符串表示 – nhuon

+0

其實,我仍然有同樣的問題。它適用於循環,而不是外部。 – nhuon