我有一个模板,它接收一个列表上下文变量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}}。另请注意,通过将渲染移动到视图中,我失去了从任意位置(特别是表格字段)轻松获取模板的能力。
答案 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 .. %}指明了问题。