更换Django默认的模板引擎为jinja2的实现方法


Posted in Python onMay 28, 2018

本机环境

操作系统:fedora24

python版本:3.5

Django版本:1.11.1

jinja2版本:2.9.6

为何要更换

DTL

先来谈谈Django的模板引擎,找了下,并没有一个确定的名字,就简单的叫Django Templates Language(DTL),中文就叫Django模板语言。使用中,大家会发现很多局限性,最明显的就是四则运算。就只能加减,乘除都不支持。另外还有判断相等,不能直接if,要用ifequal。确实不太方便。还有一点,DTL很慢,jinja2宣称比DTL快10-20倍。

jinja2

先来安装,pip3 install jinja2。

配置:从Django1.8开始,支持第三方模板引擎,可以很容易的配置到。首先,在你的项目下建立一个jinja2_env.py,内容如下:

#from __future__ import absolute_import # 如果是py2就取消这行的注释

from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse

from jinja2 import Environment


def environment(**options):
 env = Environment(**options)
 env.globals.update({
 'static': staticfiles_storage.url,
 'url': reverse,
 })
 return env

然后在setting.py设置

TEMPLATES = [
 {
 'BACKEND': 'django.template.backends.jinja2.Jinja2', ***1
 'DIRS': [os.path.join(BASE_DIR, 'templates')],
 'APP_DIRS': False, ***2
 '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',
  ],
  'environment': 'APP_NAME.jinja2_env.environment', ***3
 },
 },
]

标***的是需要修改的地方。

- ***1:这里指定引擎为jinja2

- ***2:这里确保不去app下的子目录的jinja2目录找模板

- ***3:配置环境,上边创建的py文件

这样一来,你的默认模板引擎就添加好了。

更换到jinja2要做的一些改变

切换你的ide模板语言

例如我使用pycharm,在File-Settings-Language & Frameworks-Python Template Languages中修改。

这一步不是必要,但是错误的支持模板语言会让你认为正确的标签是错误的。

csrf_token

Django:
{% csrf_token %}
jinja2
{{ csrf_input }}

<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">

四则运算

Django:只支持加减
{{ var | add:-1 }}
jinja2:四则运算
{{ var + 1 }}

if条件判断是否相等

Django:

{% ifequal vara varb %}do sometings{% endifequal %} #相等
{% ifnotequal vara varb %}do sometings{% endifnotequal %} #不等
jinja2:
{% if vara == varb %}do sometings{% endif %} #相等
{% if vara != varb %}do sometings{% endif %} #不等

说起来jinja2更符合python的语法

循环索引

Django:
{% for i in s %}
{{ forloop.counter }} #从1开始的索引
{% endfor %}
jinja2
{% for i in s %}
{{ loop.index }} #从1开始的索引
{{ loop.index0 }} #从1开始的索引
{% endfor %}

对方法的支持

Django中,方法是被当作对象的属性

jinja2中,就是当作方法,所以还可以传递参数。

比如说一个表单对象,有一个as_p()方法。

Django:
{{ form.as_p }}
jinja2:
{{ form.as_p() }}

打印不存在的变量

在Django中,如果没有传入某个字典参数,使用{{ var }}会打印一个空(什么都不打印)

但jinja2,如果值不存在,就会打印出来”{{ var }}”,要想实现如DTL的功能,请使用{{ var|default(“”) }}

一些坑

不要传入名为user的参数

实测,在模板中,本身就有变量user,是指向django.contrib.auth.models.User,如果你再传递一个字典键为user,实际相当于没传入,毫无作用,所以,改名吧。

以上这篇更换Django默认的模板引擎为jinja2的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 实现文件的全备份和差异备份详解
Dec 27 Python
python虚拟环境的安装配置图文教程
Oct 20 Python
Python2和Python3中print的用法示例总结
Oct 25 Python
python实现的MySQL增删改查操作实例小结
Dec 19 Python
python获取服务器响应cookie的实例
Dec 28 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
django 类视图的使用方法详解
Jul 24 Python
python实现发送form-data数据的方法详解
Sep 27 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
使用TensorFlow-Slim进行图像分类的实现
Dec 31 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
python利用递归方法实现求集合的幂集
Sep 07 Python
django manage.py扩展自定义命令方法
May 27 #Python
python实现windows下文件备份脚本
May 27 #Python
django 解决manage.py migrate无效的问题
May 27 #Python
关于django 数据库迁移(migrate)应该知道的一些事
May 27 #Python
解决Django migrate No changes detected 不能创建表的问题
May 27 #Python
django 在原有表格添加或删除字段的实例
May 27 #Python
用python写扫雷游戏实例代码分享
May 27 #Python
You might like
php中http_build_query 的一个问题
2012/03/25 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
eaglephp使用微信api接口开发微信框架
2014/01/09 PHP
php链表用法实例分析
2015/07/09 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
深入理解JavaScript函数参数(推荐)
2016/07/26 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
pandas对指定列进行填充的方法
2018/04/11 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
夜大毕业生自我鉴定
2013/10/31 职场文书
高中化学教学反思
2014/01/13 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
妇女干部培训方案
2014/05/12 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
优秀团员个人总结
2015/02/26 职场文书
入队仪式主持词
2015/07/04 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript
SQL中的连接查询详解
2022/06/21 SQL Server
如何利用python创作字符画
2022/06/25 Python