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. 「幻數」的概念是否從語言變爲語言?
- 2. ASP.NET MVC是否具有App_Code概念?
- 3. C語言中是否存在類型擦除概念?
- 4. C語言中的線程概念#
- 5. 具有多個模板參數的C++概念
- 6. 基於堆棧的語言是否有一個範圍的概念?
- 7. 學習編程語言概念
- 8. 概念:mongo是否適用模式?
- 9. C語言中使用Unix概念的目錄監視器的代碼
- 10. NLog是否具有與log4net的ILoggerRepository相同的概念?
- 11. Couchbase是否具有「必填字段」的概念?
- 12. PushButton遊戲引擎是否具有相機的概念?
- 13. Expression Blend是否具有修剪/裁剪的概念?
- 14. .NET Core HttpClient是否具有攔截器的概念?
- 15. WSDL是否具有異步Web方法的概念?
- 16. Android是否具有與iOS類似的Aspect Fill概念?
- 17. nanomsg是否具有「幀」作爲zeromq的概念?
- 18. MySQL是否具有「this」數據庫的概念?
- 19. 這個概念是否有一個術語,它是否存在於靜態類型語言中?
- 20. golang是否有當地的日期概念?
- 21. 當div改變位置時,是否有路徑的概念?
- 22. Oracle是否有過濾索引概念?
- 23. iPhone SDK中是否有Android Intent概念
- 24. 在任何OO語言/模型中是否有像「受控可見性」這樣的概念?
- 25. 檢查當前語言中是否存在項目?
- 26. 獲取Jinja2中的當前語言環境
- 27. 什麼是模板語言?
- 28. 各種語言的關鍵編程概念和術語
- 29. 什麼語言有「保護」關鍵字或概念?
- 30. 是否有一個Django模板語言等價於Python的range()?