更换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 相关文章推荐
py2exe 编译ico图标的代码
Mar 08 Python
Python subprocess模块学习总结
Mar 13 Python
python中使用pyhook实现键盘监控的例子
Jul 18 Python
Python深入学习之内存管理
Aug 31 Python
跟老齐学Python之模块的加载
Oct 24 Python
Python Tkinter GUI编程入门介绍
Mar 10 Python
Python中的函数式编程:不可变的数据结构
Oct 08 Python
python中正则表达式 re.findall 用法
Oct 23 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
Django Channel实时推送与聊天的示例代码
Apr 30 Python
python交互模式基础知识点学习
Jun 18 Python
Django一小时写出账号密码管理系统
Apr 29 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 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
php微信公众平台示例代码分析(二)
2016/12/06 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
使用Django开发简单接口实现文章增删改查
2019/05/09 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
Unineed旗下时尚轻奢网站:FABHunt
2019/05/13 全球购物
介绍一下Java中标识符的命名规则
2014/02/03 面试题
化学教师教学反思
2014/01/17 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
个人租房协议书
2014/04/09 职场文书
主要负责人任命书
2014/06/06 职场文书
离婚协议书怎么写
2014/09/12 职场文书
财会专业大学生求职信
2014/09/26 职场文书
2015年安全工作总结范文
2015/04/02 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
活动新闻稿范文
2015/07/17 职场文书
工程主管竞聘书
2015/09/15 职场文书
个人自我鉴定怎么写?
2019/07/01 职场文书
Python读写yaml文件
2022/03/20 Python