更换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分割TXT文件成4K的TXT文件
May 23 Python
Python标准异常和异常处理详解
Feb 02 Python
Perl中著名的Schwartzian转换问题解决实现
Jun 02 Python
Python实现的简单dns查询功能示例
May 24 Python
详解用python实现简单的遗传算法
Jan 02 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 Python
关于windows下Tensorflow和pytorch安装教程
Feb 04 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
Feb 10 Python
Python3 pickle对象串行化代码实例解析
Mar 23 Python
python中xlrd模块的使用详解
Feb 01 Python
python之基数排序的实现
Jul 26 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常量的详解
2013/06/09 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
JavaScript实现简单的数字倒计时
2015/05/15 Javascript
jQuery实现标题有打字效果的焦点图代码
2015/11/16 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
python的urllib模块显示下载进度示例
2014/01/17 Python
Python random模块用法解析及简单示例
2017/12/18 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
python主要用于哪些方向
2020/07/05 Python
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
少先队学雷锋活动月总结
2014/03/09 职场文书
婚礼主持词开场白
2014/03/13 职场文书
学校教研活动总结
2014/07/02 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
物流管理专业推荐信
2014/09/06 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
个人投资合作协议书
2014/10/12 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
闪闪红星观后感
2015/06/08 职场文书
2015重阳节座谈会主持词
2015/07/30 职场文书
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS
python 远程执行命令的详细代码
2022/02/15 Python
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript