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

news2024/11/17 9:49:02

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 views


urlpatterns = [
  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=2
    return 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.coloradmin.cn/o/660381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Liunx开发工具:git和gdb

目录 一. git的功能和使用 1.1 git的功能 1.2 git三板斧 1.3 git使用中的其他问题 二. 使用gdb调试代码 2.1 生成带有调试信息的可执行程序 2.2 gdb调试代码的方法 一. git的功能和使用 1.1 git的功能 git是一块开源、免费的版本管理系统&#xff0c;能够高效敏捷地处…

【人工智能】— 神经网络、前向传播、反向传播、梯度下降、局部最小值、多层前馈网络、缓解过拟合的策略

【人工智能】— 神经网络、前向传播、反向传播 前向传播反向传播梯度下降局部最小值多层前馈网络表示能力多层前馈网络局限缓解过拟合的策略 前向传播和反向传播都是神经网络训练中常用的重要算法。 前向传播是指将输入数据从输入层开始经过一系列的权重矩阵和激活函数的计算后…

计算机网络408大题(2009-2019)

必备结构 TCP报文段结构 IP数据报结构 2009年 考察点&#xff1a;子网划分、路由表、路由聚合 2010年 考察点&#xff1a;CSMA/CD协议的相关计算 2011年 考察点&#xff1a;以太网帧格式、IP分组格式、IP地址和MAC地址、ARP协议、HTTP/1.1持续的非流水方式 在转发过程中&am…

Jupyter中使用Pyecharts绘制地图

背景&#xff1a;根据各省频率绘制地图 根据各省频率绘制地图&#xff0c;可以使用 Pyecharts 绘制。下面是详细的步骤&#xff1a; 1、安装 Pyecharts&#xff1a;可以通过 !pip install pyecharts 命令安装。 2、导入相关库 import pandas as pd from pyecharts import o…

设计模式之抽象工厂模式笔记

设计模式之抽象工厂模式笔记 说明Abstract Factory(抽象工厂)目录UML抽象工厂示例类图甜品抽象类甜品提拉米苏类甜品抹茶慕斯类 咖啡抽象类美式咖啡类拿铁咖啡类 甜品工厂接口美式风味的甜品工厂意大利风味的甜品工厂 测试类模式扩展 说明 记录下学习设计模式-抽象工厂模式的写…

SSMP整合案例(2) Spring Boot整合Lombok简化实体类开发

好啊 接着我们上文SSMP整合案例(1) 构建 Spring Boot Vue MySql项目环境 我们继续 接下来 我们要在java项目中 建立出数据库表对应的实体类 我们还是先看看自己上文中 创建的这个 book表 其中四个字段 主键id 数字枚举类型的type 字符串类型name 字符串类型 description 我们…

【设计模式与范式:总结型】74 | 总结回顾23种经典设计模式的原理、背后的思想、应用场景等

到今天为止&#xff0c;23 种经典的设计模式已经全部讲完了。咱们整个专栏也完成了 3/4&#xff0c;马上就要进入实战环节了。在进入新模块的学习之前&#xff0c;我照例带你做一下总结回顾。23 种经典设计模式共分为 3 种类型&#xff0c;分别是创建型、结构型和行为型。今天&…

Floyd 判圈算法(Floyd Cycle Detection Algorithm)

Floyd 判圈算法(Floyd Cycle Detection Algorithm) 前言 Floyd判圈算法属于对指针操作的算法&#xff0c;它一般需要且仅需要两个指针&#xff0c;通过设定不同的指针移动速度&#xff0c;来判定链表或有限状态机中是否存在环。人为规定移动较快的指针称为快速指针(fast poin…

Java官方笔记9Lambda表达式

Lambda Expression 有了Lambda Expression&#xff0c;就不用再写anonymous classes。 写Lambda&#xff0c;首先要找到它的类型。 There is a restriction on the type of a lambda expression: it has to be a functional interface. 函数接口&#xff0c;只有1个抽象方法的接…

Vue中v-text、v-html、v-on的基本语法(二)

文章目录 前言一、vue中data属性定义对象、数组相关数据二、v-text、v-html指令使用三、v-on基本指令使用(一)四、v-on指令基本使用(二)之在函数中获取vue实例本身this五、v-on指令基本使用(二)之在函数中传递参数六、v-on指令基本使用(二)之简化写法绑定函数和事件定义的两种写…

从零搭建一台基于ROS的自动驾驶车-----2.运动控制

系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出 Autolabor ROS机器人教程 从零搭建一台基于ROS的自动驾驶车-----1.整体介…

Unreal 5 实现丧尸伤害和死亡

这一篇主要是实现玩家攻击丧尸可以造成伤害和自身血量为零时&#xff0c;丧尸可以死亡。丧尸也可以对玩家造成伤害&#xff0c;有攻击范围的判定。 这一篇的功能实现有四个功能&#xff1a; 丧尸被攻击掉血丧尸死亡处理玩家被攻击掉血玩家死亡处理 丧尸被攻击掉血 子弹的修改…

C语言内存操作函数,memcpy的使用和模拟实现,memmove的使用和模拟实现,memcmp的使用,memset的使用。

1.memcpy 函数原型&#xff1a; void *memcpy( void *dest, const void *src, size_t count );void *dest 目标数据首元素地址const void *src 源数据(需要拷贝过去的数据)size_t count 需要拷贝数据的字节大小void *memcpy 拷贝结束后&#xff0c;返回目标数据的起始地址 函…

【简单的图像信息展示应用程序】PYQt5

写在前面的话 这段代码的作用是创建一个简单的图像信息展示应用程序&#xff0c;用户可以点击按钮查看特定文件夹中图像的文件名、大小&#xff0c;并通过查看按钮查看图像。请注意&#xff0c;文件夹路径需要根据实际情况进行修改。 代码讲解 这段代码是使用PyQt5库创建一个…

特征选择:过滤法,嵌入法,包装法

特征选择时首先要去除冗余特征。 它是由其他其他的特征中推演出来的。比如&#xff0c;一个球的体积&#xff0c;那么半径这个特征就是冗余的&#xff0c;因为我们可以由球的体积推算半径。冗余特征在很多时候都是不起作用的 过滤法 过滤方法通常用作预处理步骤&#xff0c;特…

c++11 标准模板(STL)(std::basic_ios)(三)

定义于头文件 <ios> template< class CharT, class Traits std::char_traits<CharT> > class basic_ios : public std::ios_base 类 std::basic_ios 提供设施&#xff0c;以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios…

2013年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

2013考研英语&#xff08;二&#xff09;真题 Section I Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on ANSWER SHEET 1. (10 points) Given the advantages of electronic money, you mi…

某农业大学数据结构A-第2周作业

1.两个顺序表集合的差集 【问题描述】两个顺序表集合的差集 【样例输入】 25 33 57 60 48 9 13 0 12 50 23 60 4 34 25 13 0 【样例输出】 33 57 48 9 【注意】0代表输入的结束&#xff1b;可以用C风格实现&#xff0c;也可以用C风格实现&#xff0c;两种风格大家均需掌握 #…

Kafka架构

5.kafka系统的架构 5.1主题topic和分区partition topic Kafka中存储数据的逻辑分类&#xff1b;你可以理解为数据库中“表”的概念&#xff1b; 比如&#xff0c;将app端日志、微信小程序端日志、业务库订单表数据分别放入不同的topic partition分区&#xff08;提升kafka吞…

【Proteus仿真】常用器件名称

前言 我常用的仿真器件加上收集的&#xff0c;基于Proteus8.13版本。以下分为两部分&#xff0c;内容都一样&#xff0c;一部分是纯文字&#xff0c;一部分是文字图片&#xff0c;方便快速获取和定位。等积累了更多的器件后会在更新的。搜索时可以用CtrlF快速查找。 命名的规则…