Jinja2是否支持模板相對路徑例如%(here)s/other/template.html
,以包含與當前模板在文件系統中的位置相關的其他模板?Jinja2模板語言是否具有'here'(當前目錄)的概念?
22
A
回答
34
我不這麼認爲。通常,您可以通過指定相對於您所使用的任何模板加載器和環境的根的路徑來包含或擴展其他模板。
所以我們說你的模板都在/path/to/templates
,你已經設置了神社就像這樣:
import jinja2
template_dir = '/path/to/templates'
loader = jinja2.FileSystemLoader(template_dir)
environment = jinja2.Environment(loader=loader)
現在,如果你想包括/path/to/templates/includes/sidebar.html
在/path/to/templates/index.html
模板,你會寫在你的index.html
:
{% include 'includes/sidebar.html' %}
和Jinja會弄清楚如何找到它。
6
根據jinja2.Environment.join_path()的文檔,可以通過重寫join_path()來實現「模板路徑連接」來支持相對模板路徑。
class RelEnvironment(jinja2.Environment):
"""Override join_path() to enable relative template paths."""
def join_path(self, template, parent):
return os.path.join(os.path.dirname(parent), template)
14
我想補充威爾MCCUTCHEN的回答,
你可以在你的裝載機多個目錄。然後它會搜索每個目錄(按順序)直到找到模板。
例如,如果你想擁有 「sidebar.html」 而不是 「/includes/sidebar.html」 則有:
loader=jinja2.FileSystemLoader(
[os.path.join(os.path.dirname(__file__),"templates/includes"),
os.path.join(os.path.dirname(__file__),"templates")])
,而不是
loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__),"templates"))
2
最乾淨的方式克服這個限制,將與jinja2擴展,將允許import relative template names
東西喜歡:
from jinja2.ext import Extension
import re
class RelativeInclude(Extension):
"""Allows to import relative template names"""
tags = set(['include2'])
def __init__(self, environment):
super(RelativeInclude, self).__init__(environment)
self.matcher = re.compile("\.*")
def parse(self, parser):
node = parser.parse_include()
template = node.template.as_const()
if template.startswith("."):
# determine the number of go ups
up = len(self.matcher.match(template).group())
# split the current template name into path elements
# take elements minus the number of go ups
seq = parser.name.split("/")[:-up]
# extend elements with the relative path elements
seq.extend(template.split("/")[1:])
template = "/".join(seq)
node.template.value = template
return node
相關問題
- 1. express.js是否具有主目錄的概念?
- 2. 「幻數」的概念是否從語言變爲語言?
- 3. ASP.NET MVC是否具有App_Code概念?
- 4. TYPO3多語言概念
- 5. 基於語言的Jinja2模板繼承
- 6. C語言中是否存在類型擦除概念?
- 7. 概念模板證明
- 8. 基本ember.js模板概念
- 9. C語言中的線程概念#
- 10. 掛毯中的多語言概念5
- 11. 具有多個模板參數的C++概念
- 12. 基於堆棧的語言是否有一個範圍的概念?
- 13. 概念:mongo是否適用模式?
- 14. 學習編程語言概念
- 15. NLog是否具有與log4net的ILoggerRepository相同的概念?
- 16. C語言中使用Unix概念的目錄監視器的代碼
- 17. 如何獲取Jinja2模板中當前模板的文件名?
- 18. PushButton遊戲引擎是否具有相機的概念?
- 19. MySQL是否具有「this」數據庫的概念?
- 20. Expression Blend是否具有修剪/裁剪的概念?
- 21. .NET Core HttpClient是否具有攔截器的概念?
- 22. Silverlight是否具有SecurityPrincipal或類似的概念?
- 23. WSDL是否具有異步Web方法的概念?
- 24. Android是否具有與iOS類似的Aspect Fill概念?
- 25. nanomsg是否具有「幀」作爲zeromq的概念?
- 26. Couchbase是否具有「必填字段」的概念?
- 27. JavaScript是否具有l值和r值的概念?
- 28. ServiceStack ormlite是否具有瞬態屬性的概念?
- 29. Sitecore僅返回具有當前語言版本的項目
- 30. 這個概念是否有一個術語,它是否存在於靜態類型語言中?