Django4.2 学习 - 模板 Template(三)
在 Django
框架中,模板是可以帮助开发者快速生产呈现给用户页面的工具。
模板的设计方式实现了我们 MTV
(M:Model,V:View,T:Template) 中 VT
的解耦(解耦:是指降低软件模块之间的相互依赖程度),VT
有着 N:M 的关系,一个 V
可以调用任意 T
,一个 T
可以工任意 V
使用。与 Java 的 MVC
很像,M
为 Model, V 为 View 界面, C 为 Controller 控制器。
模板的处理分为 2 个过程:
- 加载 HTML
- 渲染数据(render ( ))
模板主要有 2 个部分
- HTML 静态代码
- 模板语言,动态插入的代码段(“挖坑”,“填坑”)
模板中的动态代码除了做基本的静态填充,还可以实现一些基本的运算,转换和逻辑。
静态页面:页面数据是本地固定的。
动态页面:页面数据来源于后台服务器。
1.Django 模板语法
(1)变量
视图传递给模板的数据,遵守标识符规定
语法:{{var}}
如果变量不存在,则插入空字符串
index.html
1 | <p>name:{{ name }}</p> |
views.py
1 | def index(request): |
(2)方法
方法的调用,不能有参数(没有括号)
{{str}}
{{str.upper}}
{{str.isdigit}}
{{dict.key}}
(3)标签
语法 {% tag %}
作用:
- 加载外部传入的变量
- 在输出中创建文本
- 控制循环或逻辑
1️⃣if 语句
- 单分支
1 | {% if user2.age >= 18 %} |
- 双分支
1 | {% if user2.age >= 18 %} |
- 多分支
1 | {% if user2.age >= 60 %} |
2️⃣运算符
- 判断
true
或false
,使用is 或 is not
1 | {% if user2.is_delted is False %} |
- 使用
and or
1 | {% if user2.username == 'jim' and user2.age == 29 %} |
- 使用
in
和not in
1 | {% if 'blue' in user2.favorite_color %} |
3️⃣for 语句
- 遍历列表
1 | {% for number in numbers %} |
- 循环中的下标
1 | {% for number in numbers %} |
- 带 empty 的 for 语句
1 | {% for number in numbers2 %} |
- 遍历字典
1 | <h5>遍历字典</h5> |
- 循环嵌套
1 | <h5>循环嵌套</h5> |
4️⃣注释
- 单行注释
1 | {# 注释内容 #} |
- 多行注释
1 | {% comment %} |
5️⃣过滤器
在 Django 模板中,过滤器(Filters)是一种用于在模板中对变量进行处理的工具。它们允许你在不修改原始数据的情况下,对变量进行格式化、转换或其他操作。过滤器通常用于在模板中显示数据时,对数据进行一些简单的处理,以满足特定的显示需求。
以下是一些常见的 Django 模板过滤器及其用法:
①add
1 | {# 用于对数值进行加法运算 #} |
②capfirst
1 | {# 将字符串的第一个字符转换为大写 #} |
③date
1 | {# 将日期格式化为指定的字符串格式,这里必须是日期对象 #} |
views.py
1 | # 假设user2.birthday是一个日期字符串 |
④default
1 | {# 如果变量为假(例如空字符串、空列表、None等),则使用指定的默认值 #} |
⑤default_if_none
1 | {# 如果变量为None,则使用指定的默认值 #} |
⑥dictsort/dictsortreversed
1 | {# 字典从小到大 #} |
⑦divisibleby
1 | {# 检查数值是否能被指定的数整除 #} |
⑧escape/safe
1 | {# escape 对字符串进行HTML转义,防止XSS攻击, 试了下,好像 django 对所有的 HTML 都默认转义了#} |
views.py
1 | def index(request): |
⑨filesizeformat
filesizeformat 是 Django 模板语言中的一个内置过滤器,用于将文件大小格式化为易读的格式。这个过滤器会自动将字节数转换为更人性化的单位,如 KB、MB、GB 等,并保留适当的小数位数。
过滤器的工作原理如下:
如果文件大小小于 1024 字节,它会直接显示字节数。
如果文件大小在 1024 字节到 1048576 字节之间(即 1 KB 到 1 MB 之间),它会将字节数除以 1024,并显示为 “KB”。
如果文件大小在 1048576 字节到 1073741824 字节之间(即 1 MB 到 1 GB 之间),它会将字节数除以 1048576,并显示为 “MB”。
如果文件大小大于 1073741824 字节(即大于 1 GB),它会将字节数除以 1073741824,并显示为 “GB”。
1 | <p>将文件大小格式化为易读的格式</p> |
views.py
1 | def index(request): |
⑩first/last
1 | {#<p>first:返回列表或字符串的第一个元素。</p>#} |
⑪length
1 | {#<p>length:返回列表、字符串或字典的长度。</p>#} |
⑫lower/upper
1 | {#<p>lower:将字符串转换为小写。</p>#} |
⑬slice
1 | {#<p>slice:对列表或字符串进行切片操作。</p>#} |
⑭truncatechars
1 | {#<p>slice:截断字符串并添加省略号, 这里的 10= 7 个字符 + “...” 一共 10 个字符</p>#} |
⑮truncatewords
1 | {#<p>slice:截断字符串并添加省略号,按单词截断。 这里的 5 代表 5 个单词 + “...”</p>#} |
⑯urlize
1 | <p>urlize:将URL转换为可点击的链接</p> |
⑰yesno
1 | <p>urlize:将布尔值转换为“yes”、“no”或“maybe”(如果是 None 值则显示 maybe)</p> |
⑱join
1 | <p>将一个列表中的元素连接成一个字符串,join:'连接符'</p> |
6️⃣HTML 转义
在 Django 模板中,autoescape 标签用于控制是否自动转义变量中的特殊字符。默认情况下,Django 模板会自动转义变量中的特殊字符,以防止跨站脚本攻击(XSS)。
- 自动转义的作用
自动转义会将变量中的特殊字符(如 <、>、& 等)转换为 HTML 实体,这样浏览器就不会将这些字符解释为 HTML 标签或 JavaScript 代码。例如,< 会被转换为 <,> 会被转换为 >,& 会被转换为 &。 - 关闭自动转义
有时候,你可能需要在模板中输出原始的 HTML 内容,而不希望 Django 对其进行转义。在这种情况下,你可以使用 autoescape off 标签来关闭自动转义。
1 | {% autoescape off %} |
- 打开自动转义
如果你在关闭自动转义的代码块中又需要开启自动转义,可以使用 autoescape on 标签。
1 | {% autoescape off %} |
注意事项
使用 autoescape off 时要格外小心,因为它会直接输出原始的 HTML 内容。如果变量中包含恶意的 HTML 或 JavaScript 代码,可能会导致 XSS 攻击。
只有在你确定变量的内容是安全的情况下,才应该使用 autoescape off。
如果你需要在模板中输出用户输入的内容,建议始终保持自动转义开启,以确保安全性。
通过 autoescape 标签,你可以灵活地控制 Django 模板中的自动转义行为,以满足不同的需求。🌰
1 | {% autoescape off %} |
views.py
1 | from datetime import datetime |
index.html
1 |
|
7️⃣模板继承
在 Django 模板中,block、extends、include 和 block.super 是用于模板继承和复用的重要标签。下面是一个使用这四个标签的学习例子:
假设我们有一个基础模板 base.html,它定义了网站的基本结构,包括头部、导航栏、内容区域和页脚。我们还希望在不同的页面中可以自定义内容区域的内容,同时保留基础模板的其他部分。
- 基础模板
base.html
1 |
|
在这个基础模板中,我们使用了 block 标签来定义两个可替换的区域:title 和 content。这些区域将在子模板中被填充。
- 子模板
home.html
1 | {% extends 'base.html' %} |
在这个子模板中,我们使用 extends 标签来指定继承的基础模板。然后,我们使用 block 标签来填充基础模板中的 title 和 content 区域。
- 子模板
about.html
1 | {% extends 'base.html' %} |
同样,这个子模板也继承了 base.html,并填充了 title 和 content 区域。
- 使用
include
标签:
1 | <!-- sidebar.html --> |
然后在 home.html
和 about.html
中引入这个侧边栏:
1 | <!-- home.html --> |
1 | <!-- about.html --> |
- 使用
block.super
标签:
有时候,我们希望在子模板中保留基础模板中某个 block 区域的内容,并在其基础上添加一些额外的内容。这时可以使用 block.super 标签。
假设我们希望在 about.html 的 content 区域中保留基础模板中的内容,并在其下方添加一些额外的信息.
1 | <!-- about.html --> |
2. 在 Django 项目中使用 Jinja2 模板引擎
在 Django 中使用 Jinja2 模板可以按照以下步骤进行配置和使用:
(1)安装 Jinja2
1 | pip install Jinja2 |
(2)配置 Django 以支持 Jinja2
在 Django 项目的 settings.py
文件中,需要对 TEMPLATES
配置项进行修改,以支持 Jinja2 模板引擎。具体配置如下:
1 | TEMPLATES = [ |
(3)创建 Jinja2 环境配置
在项目的某个应用目录下(例如 DjangoPro5
),创建一个名为 jinja2
的文件夹,并在该文件夹中创建一个名为 jinja2_env.py
的文件。在 jinja2_env.py` 文件中定义 Jinja2 的环境配置:
1 | from jinja2 import Environment |
(4)编写 Jinja2 模板
在 templates
文件夹中创建 Jinja2 模板文件,例如 index.html
,并使用 Jinja2 的语法编写模板内容:
1 | <!DOCTYPE html> |
(5)在视图中使用 Jinja2 模板
在 Django 的视图中,可以像使用默认模板引擎一样使用 Jinja2 模板。例如:
1 | from django.shortcuts import render |