更换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 相关文章推荐
c++生成dll使用python调用dll的方法
Jan 20 Python
python中print的不换行即时输出的快速解决方法
Jul 20 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
Python实现的简单线性回归算法实例分析
Dec 26 Python
Python设计模式之装饰模式实例详解
Jan 21 Python
python之array赋值技巧分享
Nov 28 Python
NumPy排序的实现
Jan 21 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
PyCharm刷新项目(文件)目录的实现
Feb 14 Python
python如何运行js语句
Sep 09 Python
python中pandas.read_csv()函数的深入讲解
Mar 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 IN_ARRAY 函数使用注意事项
2010/07/24 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
jQuery中click事件用法实例
2014/12/26 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
2015/11/02 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
angular十大常见问题
2017/03/07 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
Python制作爬虫采集小说
2015/10/25 Python
Python实现二叉搜索树
2016/02/03 Python
scrapy爬虫完整实例
2018/01/25 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
对python mayavi三维绘图的实现详解
2019/01/08 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
python区块及区块链的开发详解
2019/07/03 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
青春演讲稿范文
2014/05/08 职场文书
护士个人年终总结
2015/02/13 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
浅谈Redis的几个过期策略
2021/05/27 Redis
python3中apply函数和lambda函数的使用详解
2022/02/28 Python