Django中模版的使用
上一篇博客介绍了Django中模版的内置过滤器以及自定义过滤器的使用方法,这一篇博客介绍除了Django内置模版引擎外,我们还可以选择的其他模版引擎,可以在实际应用中,根据开发的场景选择不同的模版引擎,以提高开发的效率。这里主要介绍两种使用比较广泛的Django模版引擎,Jinja2和Mako。
Jinja2:
Jinja2是一套模仿Django模版的模版引擎,由flask开发者开发,它的使用场景和使用方式Django的模版非常相似。它速度快,被广泛使用。Jinja2提倡让html设计者和后端python开发工作分离。文档位置:http://jinja.pocoo.org/docs/2.10/。
Mako:
Mako模板算是Python里面比较出色的一个模板了,它宣称有比Jinja2更快的解析速度以及更多的语法支持。最大的特点在于,它可以允许你在html中随意书写python代码。
Jinja2模版引擎
下面介绍Jinja2模版引擎的配置和使用方法。
安装
首先安装Jinja2的扩展库
配置
(1)在应用目录下创建jinja2_env.py,设定环境变量。
(2)在项目的配置中进行如下三项更改(settings.py):
使用
下面通过简单的示例展示,如何使用Jinja2模版引擎。
(1)创建简单的视图函数如下(app/views.py):
(2)创建简单的模版文件如下(templates/test_jinja2.html):
(3)视图函数和路由进行绑定(app/urls.py和test_jinja/urls.py):
(4)启动服务,浏览器中进行访问:
由上面的步骤可以看出,Jinja2模版引擎的使用方法和Django内置模版引擎的使用方法大体相同。下面看下Jinja2过滤器的使用和模版的继承。
Jinja2内置过滤器
以title过滤器(将每个单词的首字母大写)为例,进行展示:
内置过滤器的使用和Django内置模版相同,自定义过滤器的使用方法和Django内置模版有些差别,相对来说,Jinja2的自定义过滤器使用更加方便。
Jinja2自定义过滤器
Jinja2自定义过滤器直接在应用目录app下创建myfilter.py文件,编写自己的函数:
然后,在Jinja2的环境设置里面,将自己编写的过滤器函数添加进去:
test_jinja2.html中进行调用如下:
启动服务,访问如下:
模版的继承
Jinja2中模版的继承也是通过{% extends %}内置标签,我们把之前的base.html文件复制过来使用:
然后在test_jinja2.html文件中,通过下面的方式进行继承:
可以看到在Jinja2模版引擎中,继承父模版的方式和之前是相同的;但是在加载静态文件的时候,和之前的Django内置模版引擎不同,不再通过{% load static %} {% static static_file_path %}这样的方式进行调用,而是直接在href中设置静态文件的路径即可。
Mako模版引擎
下面介绍Mako模版引擎的配置和使用方法。
安装
配置
使用Mako模版引擎的时候,不需要在项目的配置文件(settings.py)中进行设置,不过需要我们重写一下render函数。在app/目录下创建base_render.py文件:
使用
下面通过简单的示例展示,如何使用Mako模版引擎。
(1)创建简单的视图函数如下(app/views.py):
(2)创建模版文件test_mako.html
(3)启动服务,在浏览器中进行访问
由上面的示例可以看出,在Mako模版引擎中,变量的表示方式和之前不同,现在使用${}的形式表达变量。
下面总结Mako模版引擎中的一些用法:
1、循环(% for ... %endfor)
2、代码块(<% ... %>)
示例一:
示例二:
另外:看到网上的资料显示,如果需要导入模块的话,需要使用<%! ... %>。
例如:
<%! from django.conf import settings %> ${settings.TEMPLATES[0]['DIRS'][0]}
但是在实际测试过程中,发现使用<% ... %>也是可以完成上面导入模块的功能。
3、模版继承
在Mako模版引擎中,模版的继承是通过函数继承的方式来实现的,主要用到的是:<%def> </%def>和<%inherit>。示例如下:
创建base.html文件:(这里<%def>...</%def>定义的区域就是将来子模版继承之后可以重写的部分;类似于之前的<% block data %>...<%endblock%>)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>${self.title()}</title>
${self.css()}
</head>
<body>
${self.content()}
${self.js()}
</body>
</html>
<%def name="content()">
${self.main()}
</%def>
<%def name="title()"></%def>
<%def name="main()"></%def>
<%def name="js()"></%def>
<%def name="css()"></%def>
在test_mako.html文件中,通过下面的方式进行继承和重写:
<%inherit file='base.html' />
<%def name="title()">
Test_Mako
</%def>
<%def name="main()">
Hello Mako!!!
</%def>
<%def name="js()">
<script src="https://cdn.bootcss.com/jquery/2.2.0/jquery.js"></script>
</%def>
<%def name="css()">
<link rel="stylesheet" href="/static/mako.css" />
</%def>
启动服务,访问如下:
4、模版调用
在Mako模版引擎中,一个HTML文件可以调用另外一个HTML文件,主要使用的标签是<%page />和<%include />。
创建extends.html文件(将来会被调用):
<%page args="local_content" />
<textarea>
${local_content}
</textarea>
在test_mako.html文件中,调用extends.html文件:
<%include file="extends.html" args="local_content='你好'" />
<h1>
Hello Django!
</h1>
启动服务,访问如下:
上面的部分就是对Mako模版引擎使用的一个简单介绍,因为在Mako模版引擎中我们可以直接在HTML文件中编写Python代码,进行对渲染过来的数据的二次处理,因此在Mako模版引擎中不需要过滤器。