更换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生成指定长度的随机数密码
Jan 23 Python
Python中为什么要用self探讨
Apr 14 Python
Python实现简单HTML表格解析的方法
Jun 15 Python
Python爬虫抓取手机APP的传输数据
Jan 22 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
python 实现对文件夹内的文件排序编号
Apr 12 Python
分享一下Python数据分析常用的8款工具
Apr 29 Python
python数据处理之如何选取csv文件中某几行的数据
Sep 02 Python
python 3.6.7实现端口扫描器
Sep 04 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 Python
django实现用户注册实例讲解
Oct 30 Python
python urllib库的使用详解
Apr 13 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
PHP设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
php页面消耗内存过大的处理办法
2013/03/18 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
php选择排序法实现数组排序实例分析
2015/02/16 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP+Ajax实现的检测用户名功能简单示例
2019/02/12 PHP
PHP进阶学习之命名空间基本用法分析
2019/06/18 PHP
老生常谈javascript的类型转换
2016/10/12 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
2017/01/20 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
Vue项目安装插件并保存
2019/01/28 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
python encode和decode的妙用
2009/09/02 Python
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
Python中的exec、eval使用实例
2014/09/23 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
python常用函数详解
2016/09/13 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
基于python图像处理API的使用示例
2020/04/03 Python
Python如何实现机器人聊天
2020/09/10 Python
利用python 下载bilibili视频
2020/11/13 Python
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
营销人才自我鉴定范文
2013/12/25 职场文书
经理任命书模板
2014/06/06 职场文书
开展创先争优活动总结
2014/08/28 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电