使用include动态指向HTML页面

17

我想根据一个变量指向不同的HTML文件。我正在使用以下格式的include:

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

这会抛出一个错误:

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

从这个例子中可以看出,Jinja2并不会在运行时解析变量。变量cid = ABC(ABC是路径中某个文件夹的名称),因此我期望的完整路径是:

Looking at this I know Jinja2 does not resolve the variable at runtime. The value of cid = ABC (ABC is a folder's name in the path), so I expected the total path to be:

templates/case/ABC/intro.html

如果我直接在include中使用这个解析后的路径,它就能工作。

我该如何解决这个问题?

5个回答

19

至少在Jinja2 2.7.1中,这个方法是起作用的:

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

11

以下是如何通过 include 直接传递代码的方法

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

6

在另一个Stack Overflow问题这里找到了答案:

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

3

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

在执行此操作时,请注意路径遍历攻击


Thomas,感谢您的回复。如果您的意思是我将完整路径传递给一个变量:vid = 'templates/case/{{cid}}/intro.html',然后在include中使用它.... {% include '{{vid}}' %}。我尝试过了...但是这仍然会出现相同的错误...TemplateNotFound。 - Utpal
@Utpal 你试过移除 '{{ }}' 直接使用 {% include vid %} 吗?虽然我有一段时间没用 Jinja 了,但我认为它在这方面应该与 Django 类似。你可能想查看这个类似的问题:https://dev59.com/6m025IYBdhLWcg3wST2Q - Thomas Orozco
非常感谢你,Thomas。移除“{{}}”的方法完美解决了问题。不过,我会检查一下你提醒我的“路径遍历攻击”。 - Utpal

0

{% module Template('templates/case/'+cid+'/intro.html') %}

{% 模块模板('templates/case/'+cid+'/intro.html')%}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接