如何在Django 1.8中使用jinja2作为模板引擎
如何在Django 1.8中使用jinja2作为模板引擎
我一直在寻找如何在django 1.8中使用jinja2的方法,但没有完整的资源可以用于使用django和jinja2。我想知道你们是否知道在django中使用jinja2的过程。我已经查阅了官方文档,并查看了以下问题:如何设置django 1.8以使用jinja2? 但是它们都没有清楚地解释如何以一种完整的方式使用jinja2。我刚开始使用django,不了解文档中的所有术语。非常感谢你的帮助。
在Django 1.8和Jinja2环境下,我有一些遗留的Django模板,一次性重写它们为Jinja2并不容易,因此我在my_custom_tags.py中添加了自定义标签{% jinja_include "some_template.jinja" %}。
from django.template.loader import get_template from django import template register = template.Library() @register.simple_tag(takes_context=True) def jinja_include(context, filename): template = get_template(filename) return template.render(context.flatten())
在Django模板中使用如下方式调用:
{% load my_custom_tags %}
{% jinja_include "some_template.jinja" %}
这个问题的出现是因为我在Django项目中有一些遗留的模板,这些模板使用的是Django的模板语法,而我想要将它们重写为Jinja2模板语法。然而,一次性重写所有模板并不容易,因此我需要找到一种方法在Django中使用Jinja2作为模板引擎。
为了解决这个问题,我创建了一个名为my_custom_tags.py的文件,并在其中定义了一个名为jinja_include的自定义标签。这个标签接受一个文件名作为参数,并使用get_template函数加载Jinja2模板。然后,使用render方法渲染该模板,并返回渲染后的内容。
在Django模板中,我通过加载my_custom_tags标签库并调用jinja_include标签来使用Jinja2模板。这样,我就可以在Django中使用Jinja2作为模板引擎了。
通过这种方法,我可以逐步将遗留的Django模板重写为Jinja2模板,而不需要一次性重写所有模板。这样,我可以更方便地迁移到Jinja2,并享受到Jinja2带来的一些优势。
如何在Django 1.8中使用Jinja2作为模板引擎
最近花了很多时间才弄明白一切,这里的答案并没有太大帮助。
doru的回答接近事实,但是不完整。
如何使用Jinja作为模板语言:
1.在项目文件夹中创建jinja2.py文件。这是为了修改默认的Jinja2环境(在我们的例子中,传递一些额外的全局变量)。
位置:{root}/main/jinja2.py:
from __future__ import absolute_import # 仅适用于Python 2 from jinja2 import Environment from django.contrib.staticfiles.storage import staticfiles_storage from django.core.urlresolvers import reverse def environment(**options): env = Environment(**options) env.globals.update({ 'static': staticfiles_storage.url, 'url': reverse, }) return env
2.在Django项目的设置文件中添加Jinja2后端,包括我们修改过的环境。
TEMPLATES = [ { 'BACKEND': 'django.template.backends.jinja2.Jinja2', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'environment': "main.jinja2.environment", }, }, ... ]
3.现在你不再需要在任何地方导入Jinja2,在你的视图中,你将通过Django使用Jinja模板,就像使用Django模板一样。
from django.shortcuts import render def index(request, **kwargs): return render(request, "index.html.j2", {'title': 'MyTitle', 'text': "MyText"})
最后,将APP_DIRS设置为True,Jinja将在所有已安装的应用程序的jinja2目录中搜索模板(与DTL不同,DTL会搜索templates文件夹)。如果你想改变这种行为,或者想要一些额外的调整,比如扩展匹配、过滤器或全局变量,你应该看看django-jinja扩展。
你也可以通过设置选项的TEMPLATES['DIRS']来提供额外的模板搜索目录。
“Django 2.0移除了django.core.urlresolvers模块,在1.10版本中移动到了django.urls。你应该修改任何import来使用django.urls。”参见stackoverflow.com/a/43139407
在Django 1.8中如何使用jinja2作为模板引擎的原因是希望能够在Django中使用jinja2的模板语法和功能。为了实现这个目标,需要按照以下步骤进行操作:
首先,需要安装jinja2模块:
$ pip install Jinja2
然后,在settings.py文件中修改TEMPLATES列表,将jinja2 BACKEND添加进去:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.jinja2.Jinja2', 'DIRS': [os.path.join(BASE_DIR, 'templates/jinja2')], 'APP_DIRS': True, 'OPTIONS': {'environment': 'myproject.jinja2.Environment'}, }, { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { '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/jinja2`是包含jinja2模板文件的目录。
接下来,在views.py文件中进行以下操作:
from __future__ import absolute_import # Python 2 only from jinja2 import Environment from django.contrib.staticfiles.storage import staticfiles_storage from django.urls import reverse def environment(**options): env = Environment(**options) env.globals.update({ 'static': staticfiles_storage.url, 'url': reverse, }) return env
这样,就可以在jinja2模板中使用`static`和`url`函数。
需要注意的是,使用context_processors与jinja2模板是不推荐的。而且,jinja2的APP_DIRS没有效果。在设置中,将environment配置为`myproject.jinja2.Environment`是错误的,正确的写法应该是`myproject.jinja2.environment`(小写的'e')。前者加载的是内置的Environment类,不包含自定义的函数'static'和'url'。
通过以上步骤,就能够在Django 1.8中使用jinja2作为模板引擎了。更多详细信息可以参考该文章:[http://jonathanchu.is/posts/upgrading-jinja2-templates-django-18-with-admin/](http://jonathanchu.is/posts/upgrading-jinja2-templates-django-18-with-admin/)。