搜索

首页  >  问答  >  正文

前端 - django如何使用jinja2模板引擎 ?

去百度,google搜索了很久,试了很多一直不行.
jinja2的模板解析速度快,而且又灵活,所以想切换一下.
django1.8以后,应该是支持这种模板切换了,按照官方的文档试了也不行~~

所以特地来此求助!能找的文档都找了都试过,都不行

高洛峰高洛峰2887 天前345

全部回复(1)我来回复

  • 黄舟

    黄舟2017-04-17 17:55:53

    不是不行,是有坑

    加两个文件:

    # backends.py
    
    import sys
    
    from django.template.backends import jinja2 as jinja2backend
    from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy
    from django.template import TemplateDoesNotExist, TemplateSyntaxError
    from django.utils.module_loading import import_string
    import jinja2
    import six
    
    
    # Original link:
    # https://code.djangoproject.com/attachment/ticket/24694/24694.py
    __author__ = 'carljm'
    
    
    class Jinja2Backend(jinja2backend.Jinja2):
        def __init__(self, params):
            self.context_processors = [
                import_string(p)
                for p in params['OPTIONS'].pop('context_processors', [])
            ]
            super(Jinja2Backend, self).__init__(params)
    
        def from_string(self, template_code):
            return Template(
                self.env.from_string(template_code), self.context_processors)
    
        def get_template(self, template_name):
            try:
                return Template(
                    self.env.get_template(template_name), self.context_processors)
            except jinja2.TemplateNotFound as exc:
                six.reraise(TemplateDoesNotExist, TemplateDoesNotExist(exc.args),
                            sys.exc_info()[2])
            except jinja2.TemplateSyntaxError as exc:
                six.reraise(TemplateSyntaxError, TemplateSyntaxError(exc.args),
                            sys.exc_info()[2])
    
    
    class Template(jinja2backend.Template):
    
        def __init__(self, template, context_processors):
            self.template = template
            self.context_processors = context_processors
    
        def render(self, context=None, request=None):
            if context is None:
                context = {}
            if request is not None:
                context['request'] = request
                lazy_csrf_input = csrf_input_lazy(request)
                context['csrf'] = lambda: lazy_csrf_input
                context['csrf_input'] = lazy_csrf_input
                context['csrf_token'] = csrf_token_lazy(request)
                for cp in self.context_processors:
                    context.update(cp(request))
                print(context)
            return self.template.render(context)
    # env.py
    from __future__ import absolute_import
    
    from django.contrib.staticfiles.storage import staticfiles_storage
    from django.core.urlresolvers import reverse
    
    from jinja2 import Environment
    
    
    def environment(**options):
        env = Environment(**options)
        env.globals.update({
            'static': staticfiles_storage.url,
            'url': reverse,
        })
        return env

    把它们放在你能找到的地方,然后设置:

    # settings.py
    
    CONTEXT_PROCESSORS = [
        'django.template.context_processors.debug',
        'django.template.context_processors.request',
        'django.contrib.auth.context_processors.auth',
        'django.contrib.messages.context_processors.messages',
    ]
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': CONTEXT_PROCESSORS,
            },
        },
        {
            'BACKEND': 'path.to.backends.Jinja2Backend',
            'DIRS': ['templates'],
            'APP_DIRS': True,
            'OPTIONS': {
                'environment': 'path.to.env.environment',
                'context_processors': CONTEXT_PROCESSORS,
                'extensions': [your extensions here],
            },
        },
    ]

    回复
    0
  • 取消回复