2011-09-28 47 views
1

我們已經得到了第三方的Django模板標籤是這樣的:我們每次使用的時間如何讓Django模板標籤,它擴展到另一個(宏)

{% frobnicate "foo", "bar", "baz" %} 
    do stuff with {{ frobnicator }} 
{% endfrobnicate %} 

不幸的是,do stuff with {{ frobnicator }}部分重複{% frobnicate %}標記。

什麼是建立一個標記,以便像

{% frobnicate2 "foo", "bar", "baz" %} 

...擴展到第一個例子最簡單的方法?

更新:簡單的包含標籤是不夠的。我沒有在上面的例子中說清楚,但我需要能夠操縱傳遞給擴展的參數。

+2

你的意思是[包含模板標籤](https://docs.djangoproject.com/en/1.3/howto/custom-template-tags/#inclusion-tags) –

+0

@DanielRoseman也許吧?我不確定他們是否可以在這裏做我想做的事。我會重新閱讀文檔。 –

+0

@DanielRoseman更新的問題... –

回答

2

創建一個模板過濾器,它將呈現您的custom string instead of a template file

聲明像這樣(此代碼測試)

#app_name/templatetags/frobnicative_tags.py 
from django.template import Template, Context 
register = Library() 

@register.tag(name = 'frobnicate2') 
def frobnicate2(parser, token): 
    args = token.split_contents() 
    template_string = """ 
     {%% load my-third-party-frobnicator-lib %%} 
     {%% frobnicate %s %%} 
      do stuff with {{ frobnicator }} 
     {%% endfrobnicate %%} 
    """ 
    return Frobnicate2(''.join(args[1:]), template_string) 

class Frobnicate2(template.Node): 
    def __init__(self, frobnicative_args, template_string): 
     self.template_string = template_string 
     self.args = frobnicative_args 

    def render(self, context): 
     """ 
     Dict inside a Context() is empty because we 
     need to pass a context in order to render, even if 
     the context is empty. 
     """ 
     return Template(self.template_string % self.args).render(Context({})) 

不要忘記,以取代 「我-第三方frobnicator-lib的」 同一個名字您正在加載的實際第三方庫。

然後,您可以使用{% frobnicate2 "foo", "bar", "baz" %}就像您想要的那樣渲染整個通話方標籤序列。

+1

賓果,我認爲這是我需要的。謝謝! –

+0

@付費書呆子,我剛剛在我的答案中修復了兩個小錯誤。 –

相關問題