更换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编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
Python简单生成8位随机密码的方法
May 24 Python
Python reduce()函数的用法小结
Nov 15 Python
python爬虫爬取快手视频多线程下载功能
Feb 28 Python
在pycharm上mongodb配置及可视化设置方法
Nov 30 Python
Python中常用的8种字符串操作方法
May 06 Python
Python生成一个迭代器的实操方法
Jun 18 Python
基于Python中的yield表达式介绍
Nov 19 Python
python构造函数init实例方法解析
Jan 19 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
python中return如何写
Jun 18 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
Jun 05 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实现适用于文件内容操作的分页类
2016/06/15 PHP
php自动载入类用法实例分析
2016/06/24 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
JQuery 小练习(实例代码)
2009/08/07 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
JavaScript Canvas绘制圆形时钟效果
2020/08/20 Javascript
Vue按需加载的具体实现
2017/12/02 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
使用python实现rsa算法代码
2016/02/17 Python
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
挪威手表购物网站:Klokker
2016/09/19 全球购物
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
新闻专业推荐信范文
2013/11/20 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
二手房购房意向书范本
2014/04/01 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
交通事故协议书范本
2014/11/18 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
2015年销售部工作总结范文
2015/04/27 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书
护理自荐信
2019/05/14 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android