更换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编程中对线程锁的使用
Jul 12 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
Python中的TCP socket写法示例
May 11 Python
python中的字符串内部换行方法
Jul 19 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
Python脚本按照当前日期创建多级目录
Mar 01 Python
PyTorch搭建一维线性回归模型(二)
May 22 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
Python实现动态给类和对象添加属性和方法操作示例
Feb 29 Python
用python写PDF转换器的实现
Oct 29 Python
Python离线安装openpyxl模块的步骤
Mar 30 Python
windows安装python超详细图文教程
May 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
Protoss魔法科技
2020/03/14 星际争霸
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
js编写一个简单的产品放大效果代码
2016/06/27 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
微信小程序 页面跳转传值实现代码
2017/07/27 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
通过数据库对Django进行删除字段和删除模型的操作
2015/07/21 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
python数据封装json格式数据
2018/03/04 Python
python之生产者消费者模型实现详解
2019/07/27 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
生物有机护肤品:Aurelia Probiotic Skincare
2018/01/31 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
数控技术与应用毕业生自荐信
2013/09/24 职场文书
大学生饮食连锁店创业计划书
2014/01/17 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
订货会邀请函
2015/01/31 职场文书
瘦西湖导游词
2015/02/03 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python