更换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发送arp欺骗攻击代码分析
Jan 16 Python
python判断字符串是否包含子字符串的方法
Mar 24 Python
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
python修改操作系统时间的方法
May 18 Python
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
numpy实现合并多维矩阵、list的扩展方法
May 08 Python
快速解决vue.js 模板和jinja 模板冲突的问题
Jul 26 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
python能做什么 python的含义
Oct 12 Python
Python实现病毒仿真器的方法示例(附demo)
Feb 19 Python
浅析matlab中imadjust函数
Feb 27 Python
基于Python和C++实现删除链表的节点
Jul 06 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/02/28 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
Vue.js 和 MVVM 的注意事项
2016/11/07 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
VsCode里的Vue模板的实现
2020/08/12 Javascript
在python中画正态分布图像的实例
2019/07/08 Python
Python定义一个函数的方法
2020/06/15 Python
python利用opencv实现颜色检测
2021/02/23 Python
CSS3教程:background-clip和background-origin
2008/10/17 HTML / CSS
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
美国值得信赖的婚恋交友网站:eHarmony
2018/10/04 全球购物
天网面试题
2013/04/07 面试题
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
中级会计职业生涯规划书
2014/03/01 职场文书
初三学生个人自我评定
2014/04/06 职场文书
教师考核材料
2014/05/21 职场文书
2014年度党员自我评议
2014/09/13 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
天那边观后感
2015/06/09 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP
【海涛教你打DOTA】剑圣第一人称视角解说
2022/04/01 DOTA
SQL SERVER中的流程控制语句
2022/05/25 SQL Server
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技