2012-12-02 54 views
1

我有一個部分模板,每次包含它時都需要一個隨機字符串。我需要訪問相同的隨機字符串,而不是每個包含一次,我不確定部分將包含多少次。添加隨機字符串到模板上下文的簡單方法

我正在這樣做是爲了將它添加到上下文

@register.tag 
def randomgen(parser, token): 
    return RandomgenNode() 


class RandomgenNode(template.Node): 
    def render(self, context): 
     context['randomgen_str'] = os.urandom(16).encode('hex') 
     return '' 

這讓我在部分的開始做{% randomgen %}{{ randomgen_str }}我需要的字符串。這不一定是壞的,我只是不知道是否有一個首選的方法來實現這一點。

感謝

+0

嘿亞當,是什麼你的意思是部分模板?如何通過模板標籤包含模板?主要問題是,您的模板是否可以訪問由您的視圖生成的原始上下文? – garromark

+0

是的,我的意思是我只是使用{%include%}標籤來包含它。我只是想像一個「部分」模板。這可能不是正確的名詞。是的,我可以訪問原始上下文,但每次包含我需要一個單獨的字符串,包含未知數。 –

+0

你可以看看我發佈的答案,並讓我知道它是否涵蓋了你的情況? – garromark

回答

1

感謝garromark的我能找到最好的解決方案。作業標籤完全符合我的要求。

@register.assignment_tag 
def randomgen(): 
    return os.urandom(16).encode('hex') 

然後在我的模板,我可以用在下面我包含的模板

{% randomgen as randomgen_string %} 

,並使用下面的地方,我需要的隨機字符串

{{ randomgen_str }} 
+0

現在我回顧一下,garromark的答案基本上是一樣的。只需使用添加了上下文的自定義包含代碼或我自己的方式,就可以通過自定義代碼添加到上下文中。 –

0

如果包含的模板被包裹成一個包含標籤,那麼你就可以渲染模板之前修改上下文。

例如,假設目前你只是做一個簡單的模板包括template.html

{% include "templates/template.html" %} 

這可以被包裝成像一個模板標籤:

@register.inclusion_tag("templates/template.html", takes_context=True) 
def render_my_template(context): 
    context['randomgen_str'] = os.urandom(16).encode('hex') 
    return context 

這會給你訪問在template.html的原始視圖上下文中,並將添加randomgen_str,以便您可以像訪問一樣訪問。然後,您可以撥打{% render_my_template %},而不是之前的{% include %}

+0

我不確定這裏的禮儀是否合適。你的回答讓我回答我的答案,但我用了別的東西。我只是給你答案,但我不想混淆下一個搜索的人。 –

相關問題