2014-03-25 146 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 
]