2012-09-02 18 views
8

我想根据变量指向不同的HTML文件。我使用包括以下格式:使用include动态指向HTML

{% include 'templates/case/{{cid}}/intro.html' %} 

这将引发一个错误:

TemplateNotFound: templates/case/{{cid}}/intro.html 

看着这个我知道的Jinja2在运行时不解析变量。的cid = ABC(ABC是在路径中的文件夹的名称)的价值,所以我预计总路径是:

templates/case/ABC/intro.html 

如果我在包括它直接使用此解决路径。

我怎样才能解决这个问题?

回答

2

您可以随时在视图代码中计算完整路径,并将其传递给模板,此时,删除变量周围的任何引号和大括号。

在做这个时,要小心path traversal attacks

+0

托马斯,谢谢你的回应。如果你的意思是我在一个变量中传递完整的路径:vid ='templates/case/{{cid}}/intro.html',然后在斜线中使用.... {%include'{{vid}}' %}。我试过...这给出了同样的错误... TemplateNotFound。 – Utpal

+0

@Utpal您是否尝试删除“{{}}”,然后使用{%include vid%}?虽然我可能没有使用Jinja,但我希望它能在这方面与django类似。你可能想看看这个类似的问题:http://stackoverflow.com/questions/6101864/dynamic-use-of-templates-in-jinja2 –

+0

谢谢托马斯。删除“{{}}”完美无缺。但是,我会检查你警告过我的'路径遍历攻击'。 – Utpal

2

找到了答案在另一个堆栈溢出问题here

{% set path = 'templates/case/' + cid + '/intro.html' %}{% include path %} 
6

这里是如何通过代码直接通过包括

{% include "templates/case/"+cid+"/intro.html" %} 
+0

这工作适合我与Nunjucks – colmjude

9

至少在2.7.1的Jinja2这个作品:

{% include 'templates/case/%s/intro.html' % cid %}