更换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创建XML文档
Mar 01 Python
python中元类用法实例
Oct 10 Python
python执行子进程实现进程间通信的方法
Jun 02 Python
简单谈谈python的反射机制
Jun 28 Python
Python自动发邮件脚本
Mar 31 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
Sep 08 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
Python3中_(下划线)和__(双下划线)的用途和区别
Apr 26 Python
如何基于python操作json文件获取内容
Dec 24 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
Python reversed函数及使用方法解析
Mar 17 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
杏林同学录(七)
2006/10/09 PHP
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
浅析PHP 按位与或 (^ 、&amp;)
2013/06/21 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
浅析PHP中的i++与++i的区别及效率
2016/06/15 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
js加强的经典分页实例
2013/03/15 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
Python编写电话薄实现增删改查功能
2016/05/07 Python
让python 3支持mysqldb的解决方法
2017/02/14 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
Python FFT合成波形的实例
2019/12/04 Python
python绘制彩虹图
2019/12/16 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
优秀毕业生自我鉴定
2014/02/11 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
求职教师自荐书
2014/06/19 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
如何写好开幕词?
2019/06/24 职场文书
涨工资申请书应该怎么写?
2019/07/08 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书