2014-03-25 188 views
0

我有一個模板接收列表上下文變量tags_list。我需要遍歷這個列表中的模板是這樣的「插入」標籤:包含模板標籤的Django模板變量,前{{{%some_tag%}}}

{% for tag in tags_list %} 
    {{ tag.tag }} 
{% endfor %} 

當這使得它返回tag.tag的文本值,「{%tagxxx%}」,而不是渲染標籤。

如何讓模板渲染呈現上下文變量的值?或者,是否有一個過濾器,一種逆向逐字,會導致上下文變量的值被渲染?

更新背景

TAGS_LIST通過涉及從表/模型領域的一些用戶提供的文本的EXEC一個相當複雜的過程中產生。真正的模板的相關部分看起來是這樣的:

{% for graph_row in graph_rows %} 
    <div class="row"> 
     {% for graph in graph_row %} 
      <div class="col-md-{{ graph.width }}"> 
       {{ graph.graph }} 
      </div> 
     {% endfor %} 
    </div> 
{% endfor %} 

圖中的值是這樣的:{ '圖形': '{%餅圖數據1%}', '寬度':3}

註上下文變量graph_rows中條目的順序與行中圖的順序相同,因爲它決定了頁面上圖的位置。保持此順序對於該方案正常工作至關重要。

目前,查看功能只是做一個{%include ...%}來獲取上面的模板段以正確的順序進行渲染。這種方法簡單而乾淨。

我可以像視圖一樣在視圖函數中執行一個模板渲染,但這會讓設計變得複雜一些,我希望避免這樣做,如果有一種簡單的方法來觸發{{graph .graph}}。請注意,通過將渲染移動到視圖中,我無法輕鬆地從任意位置(特別是表格字段)獲取模板。

+0

請張貼您的標籤型號代碼。 –

+0

你的意思是'tag.tag'的值是'{%tagxxx%]',你想要渲染?這是不可能的。 (至少不是默認情況下...) – rednaw

+0

你想迭代這個列表'插入'標籤,所以它在views.py可能會更好 – WeizhongTu

回答

0

一個關於Django的偉大的事情是解決方案和代碼段的庫。可悲的是,他們不是一個組織良好,很容易找到人們所希望的。然而,有些谷歌的發現了大量的一般形式的解決方案

{% render tag.tag %} 

這裏是鏈接到幾個:

我將使用一般的方法清理了一下錯誤che該死。

另外,這項技術讓我感覺通常很有用,可能適合包含在標準標籤中。

更新2014年3月28日

看着上面和其他幾個人後,這是我從使用。有一個有用的評論here

from django import template 
from django.template import Template, Variable, TemplateSyntaxError 

register = template.Library() 

class RenderAsTemplateNode(template.Node): 
    def __init__(self, item_to_be_rendered): 
     self.item_to_be_rendered = Variable(item_to_be_rendered) 

    def render(self, context): 
     try: 
      actual_item = self.item_to_be_rendered.resolve(context) 
      return Template(actual_item).render(context) 
     except template.VariableDoesNotExist: 
      return '' 

def render_as_template(parser, token): 
    bits = token.split_contents() 
    if len(bits) !=2: 
     raise TemplateSyntaxError("'%s' takes only one argument" 
            " (a variable representing a template to render)" % bits[0])  
    return RenderAsTemplateNode(bits[1]) 

render_as_template = register.tag(render_as_template) 

這是獲得解決方案的一部分。不幸的是自定義模板標籤,在我的情況下, {%pie_chart%}不能在RenderAsTemplateNode類中呈現。

我還沒有測試過這個,但是看起來這個堆棧溢出問題Django - replacing built-in templatetag by custom tag for a whole site without {% load .. %}指明瞭方向。

0

我相信我可以爲您提供一種獲得想要的結果的方式,但是如果您可以提供一些上下文,則可能有更好的方法來實現所需的功能。

無論如何,你可以做你的view.py是這樣的:

tags_list = [ 
    Template('{% load my_tags %}{% ' + t.tag + ' %}').render(Context()) 
    for t in tags_list 
]