복붙노트

[PYTHON] Jinja2 템플릿 언어에 '여기'(현재 디렉토리)라는 개념이 있습니까?

PYTHON

Jinja2 템플릿 언어에 '여기'(현재 디렉토리)라는 개념이 있습니까?

Jinja2는 템플릿과 관련된 경로를 지원합니까? % (here) s / other / template.html, 파일 시스템에있는 현재 템플릿의 위치에 상대적인 다른 템플릿을 포함 하시겠습니까?

해결법

  1. ==============================

    1.나는 그렇게 믿지 않는다. 일반적으로 사용중인 템플릿 로더 및 환경의 루트와 관련하여 경로를 지정하여 다른 템플릿을 포함하거나 확장합니다.

    나는 그렇게 믿지 않는다. 일반적으로 사용중인 템플릿 로더 및 환경의 루트와 관련하여 경로를 지정하여 다른 템플릿을 포함하거나 확장합니다.

    템플릿이 모두 / path / to / templates에 있고 Jinja를 다음과 같이 설정했다고 가정 해 봅시다.

    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는 그것을 찾는 방법을 알아낼 것입니다.

  2. ==============================

    2.Will McCutchen의 답변에 덧붙이면,

    Will McCutchen의 답변에 덧붙이면,

    로더에 여러 디렉토리를 가질 수 있습니다. 그런 다음 템플릿을 찾을 때까지 각 디렉토리를 순서대로 검색합니다.

    예를 들어 "/includes/sidebar.html"대신 "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"))
    
  3. ==============================

    3.jinja2.Environment.join_path ()에 대한 문서에 따르면, "템플리트 경로 결합"을 구현하기 위해 join_path ()를 대체함으로써 상대적인 템플리트 경로에 대한 지원이 가능합니다.

    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)
    
  4. ==============================

    4.이 제한을 극복하는 가장 깨끗한 방법은 상대적인 템플릿 이름을 가져올 수있는 jinja2 확장을 사용하는 것입니다.

    이 제한을 극복하는 가장 깨끗한 방법은 상대적인 템플릿 이름을 가져올 수있는 jinja2 확장을 사용하는 것입니다.

    다음 중 좋아하는 것 :

    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
    
  5. ==============================

    5.Django 2.x는 상대적인 템플릿을 가져올 수 있습니다. :피

    Django 2.x는 상대적인 템플릿을 가져올 수 있습니다. :피

  6. from https://stackoverflow.com/questions/2180247/does-the-jinja2-templating-language-have-the-concept-of-here-current-director by cc-by-sa and MIT license