Django基础入门⑤:模板变量和标签的使用

news/2024/11/28 15:51:20/

Django基础入门④:数据表显示和Django模板详讲

  • 模板变量使用
    • 模板变量
    • 模板标签
    • if标签
    • for标签
    • forloop变量
    • forloop.revcounter 示例
    • forloop.first 和 forloop.last 示例
    • forloop.parentloop 示例

🏘️🏘️个人简介:以山河作礼。
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人
🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读!
🎁🎁:文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。


模板变量使用

在这里插入图片描述

📑📑模板变量是指在模板中使用的变量,它们通常是从视图函数中传递过来的

📌Django 模板语言的语法主要分为以下四个部分:

  • 变量
  • 标签
  • 过滤器
  • 注释

模板变量

  • 前面的内容中我们提到了模板变量,并且已经使用了它,如{{name}}。

  • Django模板引擎通过上下文处理器来完成字典提供的值(value)

  • 与模板变量之间的替换,也就是用字典的 vaule来替换模板文件 xxxx.html 中的变量 {{name}},这就好比字典中 key 到
    vaule 的映射。而我们无需关心内部细节是如何让实现的,这些由 Django 框架自己完成。

  • 变量的命名规范

Django对于模板变量的命名规范没有太多的要求,可以使用任何字母、数字和下划线的组合来命名,且必须以字母或下划线开头,但是变量名称中不能有空格或者标点符号。

  • 模板变量的语法

📑 如何理解模板的变量语法,其实它有四种不同的使用场景,分别如下所示:

  • 索引 index 查询,如 {{变量名.index}},其中 index 为int类型即索引下标
  • 字典查询方法,{{变量名.key}} 其中 key 代表字典的键,如 a[‘b’]
  • 属性或方法查询,如 {{对象.方法}} ,把圆点前的内容理解成一个对象,把圆点后的内容理解为对象里面的属性或者方法
  • 函数调用,如 {{函数名}}。

📑下面我们对上面的语法依次进行说明,首先在views.py中添加如下代码:

def test_hello():return '我是函数的返回数据'class WebSite:def web_name(self):return 'Hello world!'def test_html(request):a = {'name': 'xxx','list_obj': ["Python", "C", "C++", "Java"],'dict_obj': {'name': '百度', 'address': 'https://www.baidu.com/'},'func': test_hello,'class_obj': WebSite()}  # 创建空字典,模板必须以字典的形式进行传参return render(request, 'test_html.html', a)

📑 其次在templates 目录下创建名为 test_html 的 html 文件,然后添加以下代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><p>名字是{{ name }}</p><p>列表数据是{{ list_obj }}</p><p>课程是{{ list_obj.0 }}</p><p>变量dict_obj是{{ dict_obj }}</p><p>dict_obj['address']是{{dict_obj.address}}</p><p>函数fuction:{{ func }}</p><p>类实例化对象:{{class_obj.web_name}}</p>
</body>
</html>

📑 然后在 urls.py 文件中添加路由配置,如下所示:

from django.contrib import admin
from django.urls import path
from Bookstore import viewsurlpatterns = [path('test_html/', views.test_html)
]

📑 接下来访问指定的路由路径就可以访问到页面了。

  • 📌模板传参语法格式

📑 在视图函数中必须将变量封装到字典中才允许传递到模板上,语法格式如下:

#方式1
def xxx_view(request)dic = {"变量1":"值1","变量2":"值2",}return render(request, 'xxx.html', dic)#方式2
def xxx_view(request)变量1=1变量2=2return render(request, 'xxx.html', locals())

📌注意:

locals() 返回当前函数作用域内全部局部变量形成的字典。即将变量与值对应形成字典,并把这个字典作为 locals() 的返回值来使用。

模板标签

Django 内置了许多标签用于简化模板的开发过程,同时 Django 也支持自定义标签,这极大的方便了 Web开发者,下面我们依次进行介绍。

📑Django 的模板系统对标签的解释是在渲染的过程中提供相应的逻辑,比如Python 语言中 if…else 语句、with 语句、以及 for 循环等,这些在 Django 的模板系统中都有对应的标签,不过稍微复杂些。

📌它们的使用方式如下所示

{% tag %}

if标签

我们知道if 在 Python 语言中是判断条件是否成立的,在模板标签中它们作用是类似的,如果条件成立则显示块中的内容。

📑模板标签规定了 if 需要与 endif 成对出现 ,使用的方式如下所示:

{% if 条件表达式1 %}......
{% elif 条件表达式2 %}
......
{% elif 条件表达式3 %}
......
{% else %}
......
{% endif %}  # if的结束

上面的 if 示例中就是使用了开始标签和结束标签,它们分别写在了开始位置和结束位置。

📌注意:模板标签内部的两边空格不要省略。

📑那 if 标签具体又是如何使用的呢,下面我们通过一个简单的例子来看一下:

#在views.py 中添加如下代码
def test_if(request):dic={'x':2**4}return render(request,'test_if.html',dic)

📑在 templates 目录中创建 test_if.html 文件 ,并在body中添加以下代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>{% if x > 0 %}<h2>{{ x }}是大于0的</h2>{% elif x == 0 %}<h3>{{ x }}是等于0的</h3>{% elif x < 0 %}<h4>{{ x }}是小于0的</h4>{% endif %}
</body>
</html>

📑最后在 urls.py 文件中配置路由如下所示:

path('test_if/',views.test_if)

从上面例子还可以看出,在 if 标签中可以使用算术操作符,如 >、<、==、<= 等符号,同时也可以使用逻辑运算符 and、or来连接多个条件,以及使用 not 对当前条件取反。

📌注意:elif 和 else 这两个标签是可选的,elif 标签可以不止一个,但是 else 标签只有一个,同时也可以都不出现在 if 标签中,只使用 if 与 endif。

📑如果当判断的条件太多时,为了避免过多的连接操作符的出现,同样可以考虑使用嵌套的 if 标签。

格式如下所示:

{% if 条件表达式1 %}{% if 条件表达式2 %}......{% elif 条件表达式3 %}......{% else %}......{% endif %}
{% endif %}

📑在这里我们介绍另外一种方式来简单的演示如何使用嵌套 if 标签,在 views.py 文件中添加如下代码:

from django.template import Template, Context #调用template、以及上下文处理器方法
def Hello_MyWeb(request):#调用template()方法生成模板t = Template("""{% if web.name == 'xx' %}{% if printable %}<h1>Hello xx</h1>{% else %}<h2>欢迎您下次访问,xx</h2>{% endif %}{% endif %}""")c = Context({'web': {'name': 'xx'}, 'printable': True})  #Context必须是字典类型的对象,用来给模板传递数据html = t.render(c)return HttpResponse(html)

📑然后我们在 urls.py 文件中为 hello_MyWeb() 函数配置路由映射关系,如下所示:

path('Hello_MyWeb/',views.Hello_MyWeb)

以上讲解了 Django 模板标签中的 if 标签的使用方法。在学习的过程一定要懂得融会贯通 ,因为 Django 是基于 Python 的Web 框架,它纵然有自己的特点,但是万变不离其宗,所以学会结合 Python 语言去学习会有利我们快速理解与掌握相关的知识。

for标签

for 标签用于对可迭代对象进行遍历,包括列表、元组等,它与 Python 中的 for 语法是类似的。for 标签 使用时也需要和 endfor 标签配合使用,当然它也有不同之处,那就是它多了一个可选的 empty 标签,比如用它来显示当列表不存在或者列表中元素为空的时候要显示的内容。

它的使用格式如下:

{% for 变量 in 可迭代对象 %}... 循环语句
{% empty %}... 可迭代对象无数据时填充的语句
{% endfor %}

📑我们通过一个具体的实例来看一下它的用法,在 views.py 中添加如下代码:

def test_for(request):#调用template()方法生成模板t1 = Template("""{% for item in list %}<li>{{ item }}</li>{% empty %}<h1>如果找不到你想要,可以来百度(网址:https://www.baidu.com)</h1>{% endfor %}""")#调用 Context()方法c1 = Context({'list': ['Python', 'Java', 'C', 'Javascript', 'C++']})html = t1.render(c1)return HttpResponse(html)

并配置路由映射关系,如下所示:

path('test_for/',views.test_for)

📌提示:与 Python 中的 for 循环不同的是,for 标签只能一次性地遍历完列表中的元素,不能中断(break),也不能跳过(continue)

forloop变量

在 for 标签还提供了内置变量forloop,我们可以访问这个变量的属性从而获取 for 循环迭代过程中的一些信息,比如forloop.first,它的返回值是一个布尔值,当 for 循环迭代第一个元素的时候返回 True, 若有其余元素则返回的是False。

forloop 的属性主要有以下几个:

变量描述
forloop.counter用来计数,查看当前迭代第几个元素(从1开始索引)
forloop.revcounter表示当前循环中剩余的未被迭代的元素数量(从1开始索引)
forloop.first如果当前迭代的是第一个元素,则为True
forloop.last如果当前迭代的是最后一个元素,则为True
forloop.parentloop在嵌套循环中,用来引用外层循环的 forloop

实例说明如下所示:

def test_forloop(request):a = Template("""{% for item in lists %}<div><p><b>{{ forloop.counter }}:{{ item }}</b></p></div>{% endfor %}""")b = Context({'lists': ['c语言', 'Django官网', 'Pytho官网']})html = a.render(b)return HttpResponse(html)  # 数字与元素以 1:'c语言' 的形式出现

路由映射关系,如下所示:

path('test_forloop/', views.test_forloop),

下面是一些演示示例:

forloop.revcounter 示例

forloop.revcounter 表示当前循环中剩余的未被迭代的元素数量(从1开始索引)

{% for num in numbers %}{{ num }} ({{ forloop.revcounter }} left)
{% endfor %}

假设 numbers 列表包含 [2, 4, 6, 8, 10],则渲染结果为:

2 (5 left)
4 (4 left)
6 (3 left)
8 (2 left)
10 (1 left)

forloop.first 和 forloop.last 示例

forloop.first 如果当前迭代的是第一个元素,则为True

forloop.last 如果当前迭代的是最后一个元素

{% for i in list1 %}{% if forloop.first %}<p>通过forloop.first 获取到第一个参数{{ i }}</p>{% elif forloop.last %}<p>通过forloop.last 获取到最后一个参数{{ i }}</p>{% else %}<p>{{ i }} 的计数是 {{ forloop.counter }} ,后面未被迭代的数据为 {{ forloop.revcounter }} </p>{% endif %}{% empty %}<p>列表中没有数据</p>{% endfor %}

forloop.parentloop 示例

forloop.parentloop在嵌套循环中,用来引用外层循环的 forloop

{% for category in categories %}<h2>{{ category.name }}</h2>{% if category.products %}<ul>{% for product in category.products %}<li>{{ product.name }}</li>{% endfor %}</ul>{% endif %}
{% endfor %}

假设 categories列表包含两个对象,每个对象包含一个名称属性和一个产品列表属性。渲染结果将输出每个类别的产品列表,最后还要输出类别的总数。

在内部循环中,我们可以使用forloop.parentloop引用外部循环上下文,在这里它允许我们检查是否在迭代列表内的最后一个元素,以便在所有类别都遍历完后输出总数。


http://www.ppmy.cn/news/455424.html

相关文章

新手Maven入门(二)

依赖管理和插件 一、依赖管理二、构建的生命周期三、插件四、插件管理五、存储库六、快照和发布七、POM 的继承和聚合 一、依赖管理 上一篇我们说到了依赖&#xff0c;下来我们继续看依赖管理。 POM 的元素包含可以被其他项目使用的声明。这样的 POM 的子项目将会自动继承这些…

NodeJSMongodbMVC管理开发⑨

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言MVC思想开发 服务器代码演示 M层 Services 或 Model V层 Views C层 Controllers总结 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c…

025.【树形结构算法】

1. 树的定义 树形结构是由n个元素组成的有限集合&#xff0c;如果n0&#xff0c;那么就称为空树&#xff1b;如果n>0&#xff0c;树形结构应该满足以下条件&#xff1a; 有一个特定的结点&#xff0c;称为根结点或根。 除根结点外&#xff0c;其余结点被分成m(m≥0)个互不…

《代码随想录 刷题顺序》

文章目录 第三章 数组第四章 链表第五章 哈希表第六章 字符串第七章 栈与队列第八章 二叉树第九章 回溯算法第十章 贪心算法第十一章 动态规划 第三章 数组 704. 二分查找 27. 移除元素 209. 长度最小的子数组 59. 螺旋矩阵II 第四章 链表 203. 移除链表元素 707. 设计链表 …

Java并发编程实战

文章目录 Java并发编程实战并发简史计算机,进程和线程什么是线程安全类?它的定义是什么?原子性与复合操作Java并发编程实战 并发简史 在早期的计算机中不包含操作系统,它们从头到尾只执行一个程序,并且这个程序能访问计算机中的所有资源。在这种裸机环境中,不仅很难编写…

SPSS高低图【012-5期】

高低图(Hight-Low Chart) 是一种利用直线、条带或阴影来描述数据在一段时间内的变化幅度的统计图形&#xff0c;适用于反映数据在一定时间段内的波动情况。高低图在股票、商品价格变动等领域都有广泛的应用。 12.6.1 高低图的类型和SPSS操作 高低图是一种能说明某种现象在一定…

基于spss的聚类分析(Cluster analysis)

聚类分析是统计学中研究这种“物以类聚” 问题的一种有效方法&#xff0c;它属于统计分析的范畴。聚类分析的实质是建立一种分类方 法&#xff0c;它能够将一批样本数据按照他们在性质上的亲密程度在没有先验知识的情况下自动进行分类。这里所说的类就是一个具 有相似性的个体的…

大学生使用计算机的调查,基于SPSS 对大学生电脑使用情况的调查研究

基于SPSS 对大学生电脑使用情况的调查研究 发表时间:2013-7-10 9:07:39 JIANGSU UNIVERSITY OF TECHNOLOGY 专业见习报告 基于SPSS 对大学生电脑使用情况的调查研究 -----以江苏理工学院为例 学院名称&#xff1a; 数 理 学 院 专 业&#xff1a; 统 计 学 班 级&#xff1a; 1…