作为一个网络框架,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 告诉模板引擎是否应该在每个已安装的应用中查找模板。
第一步:通过Template对象,传入一个字符串或者模板的文本文件
第二步:调用Template对象的 render() 方法,然后传入相应的动态变量
以下我们继续以之前的TestDjango项目下的 score应用为例,进入到score应用的 views.py文件中,修改如下
方式一:采用字符串模板
- # score/views.py
-
- # 导入模板相关库
- from django.template import Template, Context
-
-
- def index(request):
- # 定义模板
- t = Template('你好
{{ name }}
, 这是一个评分系统') - # 定义传入对象
- 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 模板文件
- "en">
- 你好
"color:red"> {{ name }}
, 这是一个评分系统
目录结构

方式三:使用模板文件(在项目的根目录下创建 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 文件用于复用
- "en">
-
你好,这是公共部分
- {% block mainbody %}
-
- {% endblock %}
再创建一个 b.html模板文件,继承common.html
- "en">
-
你好,这是公共部分
- {% block mainbody %}
-
- {% endblock %}
最后修改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 公众号同款,欢迎关注!!