2010-02-01 5 views
22

क्या Jinja2 टेम्पलेट-सापेक्ष पथ का समर्थन करता है उदा। %(here)s/other/template.html, फाइल सिस्टम में वर्तमान टेम्पलेट की जगह के सापेक्ष अन्य टेम्पलेट्स को शामिल करने के लिए?क्या Jinja2 templating भाषा में 'यहां' (वर्तमान निर्देशिका) की अवधारणा है?

उत्तर

34

मुझे विश्वास नहीं है। आम तौर पर आप जो भी टेम्पलेट लोडर और पर्यावरण का उपयोग कर रहे हैं, उसकी जड़ से संबंधित अपने पथ निर्दिष्ट करके अन्य टेम्पलेट्स को शामिल या विस्तारित करते हैं। ,

import jinja2 
template_dir = '/path/to/templates' 
loader = jinja2.FileSystemLoader(template_dir) 
environment = jinja2.Environment(loader=loader) 

अब अगर आप /path/to/templates/index.html टेम्पलेट में /path/to/templates/includes/sidebar.html शामिल करना चाहते हैं, तो आप लिखते हैं:

तो मान लें कि आपका टेम्पलेट्स /path/to/templates में सभी कर रहे हैं और आप तो जैसे जिंजा सेट कर लेते हैं अपने index.html में निम्नलिखित:

{% include 'includes/sidebar.html' %} 

और जिंजा यह पता लगाने होगा कि यह कैसे खोजने के लिए।

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 के जवाब में जोड़ने के लिए,

आप अपने लोडर में एकाधिक निर्देशिका हो सकता है। यह तब तक प्रत्येक निर्देशिका (क्रम में) में खोज करता है जब तक कि यह टेम्पलेट नहीं पाता।

उदाहरण के लिए

, यदि आप के बजाय "/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")) 
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 
संबंधित मुद्दे