介绍
作为一个网络框架,Django 需要一种方便的方式来动态生成 HTML。最常见的方法是依靠模板。一个模板包含了所需 HTML 输出的静态部分,以及一些特殊的语法,描述了如何插入动态内容。目前流行的 Web 框架基本都采用 MVC 的架构,而 Django 在这个架构基础上做了一点改变,即 MTV 框架,这里的 T 就是今天我们要讲的 Django 的模板系统( Template )。
一个 Django 项目可以配置一个或多个模板引擎(如果你不使用模板,甚至可以不配置模板)。Django 默认内置了一个模板系统 DTL( Django template language ),在一般的项目开发中足够应用了
Django 模板是使用 Django 模板语言标记的一个文本文档或Python字符串。模板引擎可以识别和解释一些构造。主要是变量和标签。
模板主要包含两块内容:
-
HTML的静态内容
-
动态插入的内容(Django 模板语言,简写 DTL,定义在 django.template 包中)
由 startproject 命令生成的 settings.py 定义关于模板的值:
-
DIRS 定义了一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件。
-
APP_DIRS 告诉模板引擎是否应该在每个已安装的应用中查找模板。
模板的使用
Django 模板系统其实是 Python 的一个库,使用模板通过以下两种方法
-
第一步:通过Template对象,传入一个字符串或者模板的文本文件
-
第二步:调用Template对象的 render() 方法,然后传入相应的动态变量
以下我们继续以之前的TestDjango项目下的 score应用为例,进入到score应用的 views.py文件中,修改如下
方式一:采用字符串模板
# score/views.py
# 导入模板相关库
from django.template import Template, Context
def index(request):
# 定义模板
t = Template('你好<h1 style="color:red"> {{ name }}</h1>, 这是一个评分系统')
# 定义传入对象
c = Context({'name': '张三'})
# 返回渲染模板
修改完成后,通过命令 python manage.py runserver 127.0.0.1:8080 启动服务,然后访问该URL:http://127.0.0.1:8080/score/ ,就能看到如下结果
方式二:使用模板文件(在应用的目录下创建 templates 目录,程序会自动在该目录下寻找模板。)
注:添加完方法后,记得在urls.py中加上路径
a.html 模板文件
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
你好<h1 style="color:red"> {{ name }}</h1>, 这是一个评分系统
</body>
</html>
目录结构
方式三:使用模板文件(在项目的根目录下创建 templates 目录,配置 DIRS 值)
第一步:在项目的根目录下创建 templates 目录
第二步:修改项目目录下,TestProject/settings.py 配置文件,在配置文件找到 TEMPLATES 对象,并在修改其中 DIRS 的配置路径如下:
# 注:os 需要先导入才能使用
import os
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 修改模板配置路径,
第三步:修改score下的views.py文件,添加方法,并在urls.py中添加相应路径
def template4(request):
c = {'name': "张三"}
return render(request, 'd.html', c)
最后访问页面
模板的语法
条件判断语法
{% if 条件 %}
# 满足条件展示内容
{% endif %}
# 或者
{% if 条件1 %}
# 满足条件1展示
{% elif 条件2 %}
# 满足条件2展示
{% else %}
# 不满足条件1条件2的展示
{% endif %}
# 或者多条件判断
{% if 变量1 and 变量2 %}
{% endif %}
{% if 变量1 or 变量2 %}
{% endif %}
循环语法
{% for x in xx %}
{% endfor %}
比较语法
# ifequal/ifnotequal 语法用于更直接的比较两个变量是否相等
{% ifequal user '张三' %}
{% endifequal %}
# 或者
{% ifnotequal user '张三' %}
{% endifnotequal %}
模板过滤器
过滤器使用管道字符 | 。另外过滤管道可以被套接,即一个过滤器管道的输出又可以作为下一个管道的输入
{{ 变量 | 过滤器 }}
示例
# 表示将变量 name 的值变为小写输出
{{ name|lower }}
# 将变量第一个元素转化为大写字母
{{ name|first|upper }}
模板继承
模板继承可以减少页面内容的重复定义,实现页面内容的重用。
典型应用:网站的头部、尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义
示例: 在templates中创建一个 common.html 文件用于复用
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<h1>你好,这是公共部分</h1>
{% block mainbody %}
{% endblock %}
</body>
</html>
再创建一个 b.html模板文件,继承common.html
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<h1>你好,这是公共部分</h1>
{% block mainbody %}
{% endblock %}
</body>
</html>
最后修改score应用的views.py文件
# score/views.py
def template3(request):
c = {'name': "张三"}
return render(request, 'b.html', c)
修改完成,最后通过访问 URL http://127.0.0.1:8080/score/template3 就能看到我们刚修改完的页面
注:
-
block 标签:在父模板中预留区域,在子模板中填充
-
extends 标签:在子模板中继承父模板,写在模板文件的第一行
程序猿与投资生活实录已改名为 程序猿知秋,WX 公众号同款,欢迎关注!!