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

 书友69132746 发布于 2022-10-28 11:59

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

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

1 个回答
  • 不是不行,是有坑

    加两个文件:

    # 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],
            },
        },
    ]
    2022-10-29 15:29 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有