更换Django默认的模板引擎为jinja2的实现方法
本机环境
操作系统:fedora24
python版本:3.5
Django版本:1.11.1
jinja2版本:2.9.6
为何要更换
DTL
先来谈谈Django的模板引擎,找了下,并没有一个确定的名字,就简单的叫DjangoTemplatesLanguage(DTL),中文就叫Django模板语言。使用中,大家会发现很多局限性,最明显的就是四则运算。就只能加减,乘除都不支持。另外还有判断相等,不能直接if,要用ifequal。确实不太方便。还有一点,DTL很慢,jinja2宣称比DTL快10-20倍。
jinja2
先来安装,pip3installjinja2。
配置:从Django1.8开始,支持第三方模板引擎,可以很容易的配置到。首先,在你的项目下建立一个jinja2_env.py,内容如下:
#from__future__importabsolute_import#如果是py2就取消这行的注释 fromdjango.contrib.staticfiles.storageimportstaticfiles_storage fromdjango.urlsimportreverse fromjinja2importEnvironment defenvironment(**options): env=Environment(**options) env.globals.update({ 'static':staticfiles_storage.url, 'url':reverse, }) returnenv
然后在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-PythonTemplateLanguages中修改。
这一步不是必要,但是错误的支持模板语言会让你认为正确的标签是错误的。
csrf_token
Django: {%csrf_token%} jinja2 {{csrf_input}}
或
四则运算
Django:只支持加减 {{var|add:-1}} jinja2:四则运算 {{var+1}}
if条件判断是否相等
Django: {%ifequalvaravarb%}dosometings{%endifequal%}#相等 {%ifnotequalvaravarb%}dosometings{%endifnotequal%}#不等 jinja2: {%ifvara==varb%}dosometings{%endif%}#相等 {%ifvara!=varb%}dosometings{%endif%}#不等
说起来jinja2更符合python的语法
循环索引
Django: {%foriins%} {{forloop.counter}}#从1开始的索引 {%endfor%} jinja2 {%foriins%} {{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的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。