更换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 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
python3制作捧腹网段子页爬虫
Feb 12 Python
Python从零开始创建区块链
Mar 06 Python
详解Numpy中的广播原则/机制
Sep 20 Python
Django 实现admin后台显示图片缩略图的例子
Jul 28 Python
python将数组n等分的实例
Dec 02 Python
python读取ini配置文件过程示范
Dec 23 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
Python爬虫教程知识点总结
Oct 19 Python
PyQt实现计数器的方法示例
Jan 18 Python
Python基础之进程详解
May 21 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 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根据分类合并数组的方法实例详解
2013/11/06 PHP
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
简单谈谈php浮点数精确运算
2016/03/10 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
菜单效果
2006/10/14 Javascript
一种JavaScript的设计模式
2006/11/22 Javascript
javascript 常用代码技巧大收集
2009/02/25 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
JS中处理时间之setUTCMinutes()方法的使用
2015/06/12 Javascript
JavaScript动态生成二维码图片
2016/04/20 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
JavaScript实现的数字与字符串转换功能示例
2017/08/23 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
python3实现UDP协议的服务器和客户端
2017/06/14 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python进阶之尾递归的用法实例
2018/01/31 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
Python字符串的一些操作方法总结
2019/06/10 Python
详解python中__name__的意义以及作用
2019/08/07 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
html5 video标签屏蔽右键视频另存为的js代码
2013/11/12 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
应征英语教师求职信
2013/11/27 职场文书
岳父生日宴会答谢词
2014/01/13 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python
Python re.sub 反向引用的实现
2021/07/07 Python
mysql如何查询连续记录
2022/05/11 MySQL
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python