模板语法的传值,变量渲染 和 取值,八大基本数据类型,有无返回值函数,类及类的对象,过滤器,标签(Tags)
Ⅰ Django框架之模板层
【一】模板语法的传值
- {{ }} : 变量相关
- {% %}: 逻辑相关
【二】变量渲染 和 取值
【1】变量渲染
直接渲染后端传入的变量名即可
- 在Django的模板语言中按此语法使用:
- {{ 变量名 }}
- 当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身
- 变量的命名包括任何字母数字以及下划线 ("_")的组合
- 变量名称中不能有空格或标点符号。
【2】变量取值
从字典中或列表中如何取值
- 点(.)在模板语言中有特殊的含义。
- 当模版系统遇到点("."),它将以这样的顺序查询:
- 字典查询(Dictionary lookup)
- 属性或方法查询(Attribute or method lookup)
- 数字索引查询(Numeric index lookup)
- 当模版系统遇到点("."),它将以这样的顺序查询:
【3】注意事项
● 如果计算结果的值是可调用的,它将被无参数的调用。 调用的结果将成为模版的值。
● 如果使用的变量不存在, 模版系统将插入 string_if_invalid 选项的值, 它被默认设置为'' (空字符串) 。
【三】八大基本数据类型
【1】路由
from django.urls import path
from user.views import index
urlpatterns = [
path('index/', index, name='index'),
]
【2】视图
from django.shortcuts import render, HttpResponse
def index(request):
# 模板语法可以传递的后端Python数据类型
# 整型
a = 123
# 浮点型
b = 11.11
# 字符串
name = "silence"
# 列表
num_list = ["你好", "我好", "大家好"]
# 字典
# 前端渲染的是字典的键 ---> HttpResponse
# Django的模板语法系统 ---> 渲染的是字典
# 对于前端来说 字典类型就是 对象 object 类型 对象.属性取值
# 前端渲染字典的时候取值可以沿用 keys values items
num_dict = {"username": "silence", "password": 741}
# 布尔
is_true = True
# 元祖
# 元祖是可迭代类型 ---> 可以被遍历
num_tuple = (11, 22, 33)
# 集合
num_set = {1, 2, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
# 将所有数据打包发送给前端
return render(request, 'login.html', locals())
【3】前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<h1>Django的模版语法系统</h1>
<p>整型 {{ a }}</p>
<p>浮点型 {{ b }}</p>
<p>字符串 {{ name }}</p>
<h2>列表类型</h2>
{{ num_list }}
<ul>
{% for num in num_list %}
<li>{{ num }}</li>
{% endfor %}
</ul>
<h2>字典类型</h2>
{{ num_dict }}
<br>
{{ num_dict.username }}
<br>
{% for key,value in num_dict.items %}
{{ key }} : {{ value }}
{% endfor %}
<h2>布尔类型</h2>
<p>布尔 {{ is_true }}</p>
<h2>元祖类型</h2>
{{ num_tuple }}
<ol>
{% for num in num_tuple %}
<li>{{ num }}</li>
{% endfor %}
</ol>
<h2>集合类型</h2>
{{ num_set }}
<ul>
{% for num in num_set %}
<li>{{ num }}</li>
{% endfor %}
</ul>
</body>
</html>
【4】页面展示
Django的模版语法系统
整型 123
浮点型 11.11
字符串 silence
列表类型
['你好', '我好', '大家好']
你好
我好
大家好
字典类型
{'username': 'silence', 'password': 741}
silence
username : silence password : 741
布尔类型
布尔 True
元祖类型
(11, 22, 33)
11
22
33
集合类型
{1, 2, 31}
1
2
31
【四】有无返回值函数
【1】路由
from django.urls import path
from user.views import index
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', index, name='index'),
【2】视图
from django.shortcuts import render, HttpResponse
def index(request):
def listen():
print("你真棒")
# 前端渲染的是无返回值的函数 得到的结果就是 None 没返回值
def run():
return "run"
# 前端渲染的是有返回值的函数 得到的结果就是当前函数的返回值
def swam(name):
return f'{name} is swarming'
# 前端在渲染函数的时候是会执行后端渲染那个指定的函数的
# 如果函数有参数 在前端是没有办法渲染的 原因是没有办法传递参数给后端
return render(request, 'login.html', locals())
【3】前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<h1>渲染无返回值的函数</h1>
{{ listen }}
<h1>渲染有返回值的函数</h1>
{{ run }}
<h1>渲染有参数有返回值的函数</h1>
{{ swam }}
</body>
</html>
【4】页面展示
渲染无返回值的函数
None
渲染有返回值的函数
run
渲染有参数有返回值的函数
【5】总结
- 函数放到模版语法中会自动调用
- 但是模版语法不支持给函数添加其他的参数
【五】类及类的对象
【1】路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view(), name='index'),
]
【2】视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
class User(object):
print(f" User 类被执行 ... ")
def __init__(self, name):
self.name = name
# 绑定给对象的方法
def bind_to_obj(self):
print(f'bind_to_obj 被执行 ... ')
return f"bind_to_obj 的返回值"
# 绑定给类的方法
@classmethod
def bind_to_cls(cls):
print(f'bind_to_cls 被执行 ... ')
return f"bind_to_cls 的返回值"
# 静态方法
@staticmethod
def bind_to_any():
print(f'bind_to_any 被执行 ... ')
return f"bind_to_any 的返回值"
# 定制打印对象的时候会触发的内容
def __str__(self):
# __str__ 的返回值必须是字符串
return f" User 's obj is called"
# 初始化类得到对象
obj = User(name="silence")
# 【1】渲染类名的时候 类确实被调用了 但是没有渲染任何内容
# 【2】定制打印类会显示的内容 ----> 元类中的 __str__
print(User) # <class 'user.views.LoginView.get.<locals>.User'>
# 在类里面定制的 __str__ 定制打印对象的显示的内容
print(obj)
# 【3】对象调用对象的绑定方法 ---> 返回当前函数的返回值
# 类调用对象的绑定方法 ---> 没有结果
# 【4】对象调用类的绑定方法 ---> 返回当前函数的返回值
# 类调用累的绑定方法 ---> 没有结果
# 【5】对象调用静态方法 ---> 返回当前函数的返回值
# 类调用静态方法 ---> 没有结果
# 【6】渲染类产生的对象
# 当你对类内部的 __str__ 重写以后 再打印对象 就是你定制后的结果
# 【7】对象是可以调用自己初始化过的属性的
user_data = {
"username": "silence",
"password": "<PASSWORD>"
}
num_list = [1, 2, 3]
return render(request, 'login.html', locals())
【3】前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>渲染类</h1>
<p>渲染类 :::: {{ User }}</p>
<h1>渲染绑定给对象的方法</h1>
<p>类调用对象的绑定方法 : {{ User.bind_to_obj }}</p>
<p>对象调用对象的绑定方法 : {{ obj.bind_to_obj }}</p>
<h1>渲染绑定给类的方法</h1>
<p>类调用类的绑定方法 : {{ User.bind_to_cls }}</p>
<p>对象调用类的绑定方法 : {{ obj.bind_to_cls }}</p>
<h1>渲染静态方法</h1>
<p>类调用静态方法 : {{ User.bind_to_any }}</p>
<p>对象调用静态方法 : {{ obj.bind_to_any }}</p>
<h1>渲染类产生的对象</h1>
<p>类产生的对象 : {{ obj }}</p>
<p>对象调用自己的属性 : {{ obj.name }}</p>
<p>
{{ user_data.username }}
{{ num_list.0 }}
</p>
</body>
</html>
【4】页面展示
渲染类
渲染类 ::::
渲染绑定给对象的方法
类调用对象的绑定方法 :
对象调用对象的绑定方法 : bind_to_obj 的返回值
渲染绑定给类的方法
类调用类的绑定方法 :
对象调用类的绑定方法 : bind_to_cls 的返回值
渲染静态方法
类调用静态方法 :
对象调用静态方法 : bind_to_any 的返回值
渲染类产生的对象
类产生的对象 : User 's obj is called
对象调用自己的属性 : silence
silence 1
【5】小结
- 模版语法会自动判断当前位置的变量名是否可以加括号调用
- 如果可以就会自执行
- 如果不能执行就会忽略
- 一般针对的是对象和类
Ⅱ 过滤器
【一】过滤器
- 在Django的模板语言中,通过使用 过滤器 来改变变量的显示。
【1】过滤器的语法
- {{ value|filter_name:参数 }}
- 使用管道符"|"来应用过滤器。
- 例如:
- {{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。
- lower在这里的作用是将文本全都变成小写。
【2】注意事项
- 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
- 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
- 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
- |,左右没有空格!没有空格!没有空格!
Django的模板语言中提供了大约六十个内置过滤器。
【二】语法
{{数据|过滤器:参数}}
【1】计算长度(length)
(1)语法
- 返回值的长度,作用于字符串和列表。
- {{ value|length }}
- 返回value的长度
- 如 value=['a', 'b', 'c', 'd']的话,就显示4.
(2)使用
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
name = "silence"
num_list = [1, 2, 3]
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>统计数据长度</h1>
<p>{{ name|length }}</p>
<p>{{ num_list|length }}</p>
</body>
</html>
[4]页面展示
统计数据长度
7
3
【2】默认值(default)
(1)语法
- 如果一个变量是false或者为空,使用给定的默认值。
- 否则,使用变量的值。
{{ value|default:"nothing"}}
- 如果value没有传值或者值为空的话就显示nothing
(2)使用
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
is_right = True
is_error = False
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>渲染默认值</h1>
<p>{{ is_right|default:"这是默认值" }}</p>
<p>{{ is_error|default:"这是默认值" }}</p>
</body>
</html>
[4]页面展示
渲染默认值
True
这是默认值
【3】日期格式化(date)
(1)语法
- 格式化
{{ value|date:"Y-m-d H:i:s"}}
- 可用的参数:
格式化字符 | 描述 | 示例输出 |
---|---|---|
a | 'a.m.'或'p.m.'(请注意,这与PHP的输出略有不同,因为这包括符合Associated Press风格的期间) | 'a.m.' |
A | 'AM'或'PM'。 | 'AM' |
b | 月,文字,3个字母,小写。 | 'jan' |
B | 未实现。 | |
c | ISO 8601格式。 (注意:与其他格式化程序不同,例如“Z”,“O”或“r”,如果值为naive datetime,则“c”格式化程序不会添加时区偏移量(请参阅datetime.tzinfo) 。 | 2008-01-02T10:30:00.000123+02:00或2008-01-02T10:30:00.000123如果datetime是天真的 |
d | 月的日子,带前导零的2位数字。 | '01'到'31' |
D | 一周中的文字,3个字母。 | “星期五” |
e | 时区名称 可能是任何格式,或者可能返回一个空字符串,具体取决于datetime。 | ''、'GMT'、'-500'、'US/Eastern'等 |
E | 月份,特定地区的替代表示通常用于长日期表示。 | 'listopada'(对于波兰语区域,而不是'Listopad') |
f | 时间,在12小时的小时和分钟内,如果它们为零,则分钟停留。 专有扩展。 | '1','1:30' |
F | 月,文,长。 | '一月' |
g | 小时,12小时格式,无前导零。 | '1'到'12' |
G | 小时,24小时格式,无前导零。 | '0'到'23' |
h | 小时,12小时格式。 | '01'到'12' |
H | 小时,24小时格式。 | '00'到'23' |
i | 分钟。 | '00'到'59' |
I | 夏令时间,无论是否生效。 | '1'或'0' |
j | 没有前导零的月份的日子。 | '1'到'31' |
l | 星期几,文字长。 | '星期五' |
L | 布尔值是否是一个闰年。 | True或False |
m | 月,2位数字带前导零。 | '01'到'12' |
M | 月,文字,3个字母。 | “扬” |
n | 月无前导零。 | '1'到'12' |
N | 美联社风格的月份缩写。 专有扩展。 | 'Jan.','Feb.','March','May' |
o | ISO-8601周编号,对应于使用闰年的ISO-8601周数(W)。 对于更常见的年份格式,请参见Y。 | '1999年' |
O | 与格林威治时间的差异在几小时内。 | '+0200' |
P | 时间为12小时,分钟和'a.m。'/'p.m。',如果为零,分钟停留,特殊情况下的字符串“午夜”和“中午”。 专有扩展。 | '1 am','1:30 pm' / t3>,'midnight','noon','12:30 pm' / T10> |
r | RFC 5322格式化日期。 | 'Thu, 21 Dec 2000 16:01:07 +0200' |
s | 秒,带前导零的2位数字。 | '00'到'59' |
S | 一个月的英文序数后缀,2个字符。 | 'st','nd','rd'或'th' |
t | 给定月份的天数。 | 28 to 31 |
T | 本机的时区。 | 'EST','MDT' |
u | 微秒。 | 000000 to 999999 |
U | 自Unix Epoch以来的二分之一(1970年1月1日00:00:00 UTC)。 | |
w | 星期几,数字无前导零。 | '0'(星期日)至'6'(星期六) |
W | ISO-8601周数,周数从星期一开始。 | 1,53 |
y | 年份,2位数字。 | '99' |
Y | 年,4位数。 | '1999年' |
z | 一年中的日子 | 0到365 |
Z | 时区偏移量,单位为秒。 UTC以西时区的偏移量总是为负数,对于UTC以东时,它们总是为正。 | -43200到43200 |
(2)使用
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
now_time = datetime.datetime.now()
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>渲染时间格式化</h1>
<p>{{ now_time }}</p>
<p>{{ now_time|date:"Y-m-d H:i:s" }}</p>
</body>
</html>
[4]页面展示
渲染时间格式化
June 24, 2024, 4:57 p.m.
2024-06-24 16:57:02
【4】切片操作(slice)
- 支持步长切片
(1)语法
{{ c|slice:'开始:结束:步长' }}
(2)使用
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
name = "silence"
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>切片语法</h1>
<p>{{ name|slice:"0:3:2" }}</p>
</body>
</html>
[4]页面展示
切片语法
sl
【5】切取摘要(truncatechars)
(1)语法
- 如果字符串字符多于指定的字符数量,那么会被截断。
- 所以取到的数量是指定数量减一
- 截断的字符串将以可翻译的省略号序列(“...”)结尾。
- 参数:截断的字符数
[1]字符:会将 . 算进切取个数
{{ value|truncatechars:截取长度数字,截取到的是输入长度减一}}
[2]单词:不会将 . 算进切取个数
{{ sentence|truncatewords:切取单词数量,数量是几就取几个}}
(2)使用
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
# 一串长文本只想截取某段数据
page = 'z.s d,ghfxlnljNginx是什么? Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 ,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名 ...'
sentence = 'I.just,need someone who will never abandon me'
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>截取摘要</h1>
<p>{{ page|truncatechars:8 }}</p>
<h1>切取单词</h1>
<p>{{ sentence|truncatewords:4 }}</p>
</body>
</html>
[4]页面展示
截取摘要
z.s d,g…
切取单词
I just need someone …
【6】移除指定字符(cut)
(1)语法
- 移除value中所有的与给出的变量相同的字符串
{{ value|cut:' ' }} # 例空格
- 如果value为'i love you',那么将输出'iloveyou'.
(2)使用
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
sentence = ' I just need someone who will never abandon me '
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>移除指定字符</h1>
<p>{{ sentence }}</p>
<p>{{ sentence|cut:" " }}</p>
</body>
</html>
[4]页面展示
移除指定字符
I just need someone who will never abandon me
Ijustneedsomeonewhowillneverabandonme
【7】拼接字符(join)
(1)语法
{{ d|join:"$" }} # 例如以$拼接
(2)使用
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
num_list = [1, 2, 3]
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>拼接元素</h1>
<p>{{ num_list }}</p>
<p>{{ num_list|join:"$" }}</p>
</body>
</html>
[4]页面展示
拼接元素
[1, 2, 3]
1$2$3
【8】加法(add)
(1)语法
{{ a|add:数字 }}
(2)使用
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
score = 100
score_one = '100'
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>加法运算</h1>
<p>{{ score|add:50 }}</p>
<p>{{ score_one|add:50 }}</p>
</body>
</html>
[4]页面展示
加法运算
150
150
【9】取消转义(mark_safe和safe)
- Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。
- 但是有的时候我们可能不希望这些HTML元素被转义
- 比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。
- 以后在写全栈项目时,前端代码不一定必须在前端页面书写
- 也可以选择先在后端写好,再传递给前端页面展示
(1)语法
# 1.前端取消转义
{{ html_str|safe }}
# 2.在后端取消转义
html_str = '<h1>取消转义</h1>'
from django.utils.safestring import mark_safe
html_str = mark_safe(html_str)
(2)使用
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
html_str = '<h1>取消转义</h1>'
from django.utils.safestring import mark_safe
html_str = mark_safe(html_str)
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>渲染后端的html代码</h1>
<p>{{ html_str|safe }}</p>
<p>{{ html_str }}</p>
</body>
</html>
[4]页面展示
渲染后端的html代码
取消转义 # 这种是前端取消转义 在前端用 {{ html_str|safe }}
取消转义 # 这种是后端取消转义 前端是{{ html_str }}
# 后端加了代码:html_str = '<h1>取消转义</h1>'
# from django.utils.safestring import mark_safe
# html_str = mark_safe(html_str)
# 不加下列代码在前端展示{{ html_str }} 如下
<h1>取消转义</h1>
Ⅲ 标签(Tags)
【一】for循环
【1】**普通for循环 **
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% endfor %}
</ul>
【2】for循环可用的一些参数:
Variable | Description |
---|---|
forloop.counter | 当前循环的索引值(从1开始) |
forloop.counter0 | 当前循环的索引值(从0开始) |
forloop.revcounter | 当前循环的倒序索引值(从1开始) |
forloop.revcounter0 | 当前循环的倒序索引值(从0开始) |
forloop.first | 当前循环是不是第一次循环(布尔值) |
forloop.last | 当前循环是不是最后一次循环(布尔值) |
forloop.parentloop | 本层循环的外层循环 |
(1)语法
{% for num in num_list %}
{# 【1】遍历列表获取到每一个元素的值 #}
<p>{{ num }}</p> # 1 2 3
{# 【2】从数据库中读取到了很多的数据 #}
{# 如果某个数据删除 ID #}
{# (1)forloop.counter 当前元素的位置从 1 开始 #}
<p>{{ forloop.counter }}</p> # 1 2 3
{# (2)forloop.counter0 当前元素的位置从 0 开始 #}
<p>{{ forloop.counter0 }}</p> # 0 1 2
{# (3)forloop.first 判断当前元素是够为第一个元素 是 True #}
<p>{{ forloop.first }}</p> # True False False
{# (4)forloop.last 判断当前元素是够为最后一个元素 是 True #}
<p>{{ forloop.last }}</p> # False False True
{# (5)forloop.revcounter 当前元素的位置从 1 开始 但是是倒序 #}
<p>{{ forloop.revcounter }}</p> # 3 2 1
{# (6)forloop.revcounter0 当前元素的位置从 0 开始 但是是倒序 #}
<p>{{ forloop.revcounter0 }}</p> # 2 1 0
{% endfor %}
(2)用法
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
num_list = [1, 2, 3]
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>标签语法</h1>
<h2>for 循环语法</h2>
{% for num in num_list %}
{# 【1】遍历列表获取到每一个元素的值 #}
<p>{{ num }}</p> # 1 2 3
{# 【2】从数据库中读取到了很多的数据 #}
{# 如果某个数据删除 ID #}
{# (1)forloop.counter 当前元素的位置从 1 开始 #}
<p>{{ forloop.counter }}</p> # 1 2 3
{# (2)forloop.counter0 当前元素的位置从 0 开始 #}
<p>{{ forloop.counter0 }}</p> # 0 1 2
{# (3)forloop.first 判断当前元素是够为第一个元素 是 True #}
<p>{{ forloop.first }}</p> # True False False
{# (4)forloop.last 判断当前元素是够为最后一个元素 是 True #}
<p>{{ forloop.last }}</p> # False False True
{# (5)forloop.revcounter 当前元素的位置从 1 开始 但是是倒序 #}
<p>{{ forloop.revcounter }}</p> # 3 2 1
{# (6)forloop.revcounter0 当前元素的位置从 0 开始 但是是倒序 #}
<p>{{ forloop.revcounter0 }}</p> # 2 1 0
{% endfor %}
{% for num in num_list %}
<p>有值 : {{ num }}</p> # 有值 : 1 有值 : 2 有值 : 3
{% empty %}
<p>没有值才会走 : {{ num }}</p>
{% endfor %}
{% for num in num_list %}
{% if forloop.first %}
<p style="color: red">{{ num }}</p> # 1是红色1 2不变
{% elif forloop.last %}
<p style="color: green">{{ num }}</p> # 3是绿色3
{% else %}
<p>{{ num }}</p>
{% endif %}
{% endfor %}
</body>
</html>
【3】for ... empty
(1)语法
<ul>
{% for num in num_list %}
<p>有值 : {{ num }}</p>
{% empty %}
<p>没有值才会走 : {{ num }}</p>
{% endfor %}
</ul>
(2)用法
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
num_list = [1, 2, 3]
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>标签语法</h1>
<h2>for 循环语法</h2>
{% for num in num_list %}
<p>有值 : {{ num }}</p>
{% empty %}
<p>没有值才会走 : {{ num }}</p>
{% endfor %}
</body>
</html>
[4]前端展示
有值 : 1
有值 : 2
有值 : 3
【二】if判断
【1】if ~ elif ~ else
(1)语法
{% for num in num_list %}
{% if forloop.first %}
<p style="color: red">{{ num }}</p> # 1是红色1 2不变
{% elif forloop.last %}
<p style="color: green">{{ num }}</p> # 3是绿色3
{% else %}
<p>{{ num }}</p>
{% endif %}
{% endfor %}
(2)用法
[1]路由
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', LoginView.as_view(), name='index'),
]
[2]视图
from django.shortcuts import render, HttpResponse
from django.views import View
class LoginView(View):
def get(self, request):
import datetime
num_list = [1, 2, 3]
return render(request, 'login.html', locals())
[3]前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for num in num_list %}
{% if forloop.first %}
<p style="color: red">{{ num }}</p> # 1是红色1 2不变
{% elif forloop.last %}
<p style="color: green">{{ num }}</p> # 3是绿色3
{% else %}
<p>{{ num }}</p>
{% endif %}
{% endfor %}
</body>
</html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY