更换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 相关文章推荐
Django中实现一个高性能计数器(Counter)实例
Jul 09 Python
Python字符串转换成浮点数函数分享
Jul 24 Python
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
Python机器学习算法之k均值聚类(k-means)
Feb 23 Python
linux下python使用sendmail发送邮件
May 22 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
Django框架下静态模板的继承操作示例
Nov 08 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
Apr 14 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
关于python3.9安装wordcloud出错的问题及解决办法
Nov 02 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
elgg 获取文件图标地址的方法
2010/03/20 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
javascript 面向对象继承
2009/11/26 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
如何在node的express中使用socket.io
2014/12/15 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
Bootstrap 模态框实例插件案例分析
2016/12/28 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
浅谈React Native 传参的几种方式(小结)
2019/05/21 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
Flask之flask-script模块使用
2018/07/26 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
浅谈python的输入输出,注释,基本数据类型
2019/04/02 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
通过实例解析Python return运行原理
2020/03/04 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
酒店门卫岗位职责
2013/12/29 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
营销计划书范文
2015/01/17 职场文书
博士生专家推荐信
2015/03/25 职场文书
欢送领导祝酒词
2015/08/12 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书