模板语法的传值,变量渲染 和 取值,八大基本数据类型,有无返回值函数,类及类的对象,过滤器,标签(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>
[4]前端展示

posted on   silence^  阅读(26)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示