更换Django默认的模板引擎为jinja2的实现方法
框架(架构)  /  管理员 发布于 7年前   204
本机环境
操作系统: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_storagefrom django.urls import reversefrom jinja2 import Environmentdef 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的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号