包含模板标记的Django模板变量,ex {{{%some_tag%}}}

时间:2014-03-25 15:45:34

标签: django django-templates

我有一个模板,它接收一个列表上下文变量tags_list。我需要迭代这个列表'插入'模板中的标签,如下所示:

{% 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 %}

图表值如下所示:{'graph':'{%piechart data1%}','width':3}

请注意,上下文变量graph_rows中的条目顺序非常重要,因为行中的图形顺序决定了页面上图形的位置。保留此顺序对于方案正常工作至关重要。

目前,view函数只执行{%include ...%}来获取上面的模板段,以正确的顺序呈现。这种方法简单而干净。

我可以按照建议在视图函数中执行模板渲染,但这会使设计复杂化,如果有一种简单的方法来触发{{graph的渲染,我希望避免这样做。 graph}}。另请注意,通过将渲染移动到视图中,我失去了从任意位置(特别是表格字段)轻松获取模板的能力。

2 个答案:

答案 0 :(得分:0)

我相信我可以为您提供一种获得所需结果的方法,但如果您能提供一些上下文,可能有更好的方法来实现所需的功能。

无论如何,您可以在view.py中执行类似的操作:

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

答案 1 :(得分:0)

Django的一大优点是解决方案和代码片段库。可悲的是,它们组织得很好,很容易找到,如人们所希望的那样。尽管如此,一些谷歌发现了一些一般形式的解决方案

{% render tag.tag %}

以下是几个链接:

我会使用一般方法清理一下以进行错误检查。

顺便说一句,这项技术对我来说非常有用,可能适合包含在标准标签中。

2014年3月28日更新

在查看上面和其他几个之后,这是我在render_as_template template tag中使用的内容。有一条有用的评论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 .. %}指明了问题。