更换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 匹配任意字符(包括换行符)的正则表达式写法
Oct 29 Python
pycharm 使用心得(五)断点调试
Jun 06 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 Python
基于Django框架利用Ajax实现点赞功能实例代码
Aug 19 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
PyCharm配置mongo插件的方法
Nov 30 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
Jun 18 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
python利用opencv保存、播放视频
Nov 02 Python
2021年最新用于图像处理的Python库总结
Jun 15 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学习 运算符与运算符优先级
2008/06/15 PHP
PHP生成Flash动画的实现代码
2010/03/12 PHP
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
php设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
php curl选项列表(超详细)
2013/07/01 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
javascript 写类方式之六
2009/07/05 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
vue2单元测试环境搭建
2018/05/24 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
Javascript实现鼠标点击冒泡特效
2019/12/24 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
Python字符串格式化输出方法分析
2016/04/13 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
python3 实现调用串口功能
2019/12/26 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
煤矿安全承诺书
2014/05/22 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript