解决Django换用jinja2模板引擎后admin提示“TemplateDoesNotExist”

来源:互联网 发布:数据库系统实现英文版 编辑:程序博客网 时间:2024/05/22 07:08

jinja2模板引擎号称比Django自带的快10倍,另外还有别的强大的功能,那为什么不用呢?

配置支持jinja2

新增两个文件,把它们放在项目内:

backends.py

import sysfrom django.template.backends import jinja2 as jinja2backendfrom django.template.backends.utils import csrf_input_lazy, csrf_token_lazyfrom django.template import TemplateDoesNotExist, TemplateSyntaxErrorfrom django.utils.module_loading import import_stringimport jinja2import 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_importfrom django.contrib.staticfiles.storage import staticfiles_storagefrom django.core.urlresolvers import reversefrom jinja2 import Environmentdef environment(**options):    env = Environment(**options)    env.globals.update({        'static': staticfiles_storage.url,        'url': reverse,    })    return env

setting.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': 'pathto.backends.Jinja2Backend',        'DIRS': ['templates'],        'APP_DIRS': True,        'OPTIONS': {            'environment': 'pathto.env.environment',            'context_processors': CONTEXT_PROCESSORS,            #'extensions': [your extensions here], #不知道干嘛的        },    },]
原创粉丝点击