更换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完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
使用Python内置的模块与函数进行不同进制的数的转换
Mar 12 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 Python
Python 删除连续出现的指定字符的实例
Jun 29 Python
10分钟教你用Python实现微信自动回复功能
Nov 28 Python
python读取txt文件中特定位置字符的方法
Dec 24 Python
将python2.7添加进64位系统的注册表方式
Nov 20 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
pytorch之添加BN的实现
Jan 06 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
Apr 30 Python
python在CMD界面读取excel所有数据的示例
Sep 28 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 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中的静态变量的基本用法
2014/03/20 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
JavaScript实现多种排序算法
2016/02/24 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
vue点击页面空白处实现保存功能
2019/11/06 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
Python创建xml的方法
2015/03/10 Python
一步步解析Python斗牛游戏的概率
2016/02/12 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
Python修改列表值问题解决方案
2020/03/06 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
个人充满哲理的自我评价
2014/02/20 职场文书
工作决心书范文
2014/03/11 职场文书
教师读书笔记
2015/06/29 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
go:垃圾回收GC触发条件详解
2021/04/24 Golang
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL