Django母婴商城项目实践(八)- 数据渲染与显示之首页

8、数据渲染与显示

1 概述

  • Django作为Web框架,需要一种很便利的方法动态地生成HTML网页,因此有了模板这个概念。模板包含所需HTML的部分代码以及一些特殊语法,特殊语法用于描述如何将视图传递的数据动态插入HTML网页中。
  • Django可以配置一个或多个模板引擎(甚至是0个,如前后端分离,Django只提供API,无须使用模板引擎),模板引擎有 Django 模板语言(Django Template Language,DTL)和Jinja2。Django 模板语言是Django内置的功能之一,它包含模板上下文(也可称为模板变量)标签和过滤器,各个功能说明如下:
    • 模板上下文是以变量的形式写入模板文件中的,变量值由视图函数或视图类传递所得。
    • 标签是对模板上下文进行控制输出,比如模板上下文的判断和循环控制等。
    • 模板继承隶属于标签,它是将每个模板文件重复的代码抽取出来并写在一个共用的模板文件中,其他模板文件通过继承共用模板文件来实现完整的网页输出。
    • 过滤器是对模板上下文进行操作处理,比如模板上下文的内容截取、替换或格式转换等。

2 模板上下文

  • 模板上下文(也可以称为模板变量)是模板中基本的组成单位,上下文的数据由视图函数或视图类传递。它以 { { variable }} 表示,variable是上下文的名称,它支持Python所有的数据类型,如字典、列表、元组、字符串、整型或实例化对象等。上下文的数据格式不同,在模板中的使用方式也有所差异,示例代码如下:

    #假如 variablel = '字符串或整型'
    <div>{{ variablel}}</div>
    # 输出 "<div>字符串或整型</div>"# 假如 variable2 = {'name' : '字典或实例化对象'}
    <div>{{ variable2.name }}</div>
    #输出 "<div>字典或实例化对象</div>"#假如 variable3 = ['元组或列表']
    <div>{{ variable3.0 }}</div>
    #输出 "<div>元组或列表</div>"
    

    在这里插入图片描述

  • 从上述代码发现,如果上下文的数据带有属性,就可以在上下文的末端使用 “.” 来获取某个属性的值。比如上下文为字典或实例化对象,在上下文末端使用 “.” 并写入属性名称即可在网页上显示该属性的值;若上下文为元组或列表,则在上下文末端使用 “”并设置索引下标来获取元组或列表的某个元素值。

  • 如果视图没有为模板上下文传在这里插入图片描述
    递数据或者模板上下文的某个属性、索引下标不存在,Django 就会将其设为空值。例如获取 variable2的属性age,由于上述的variable2并不存在属性age,因此网页上将会显示 “

  • 在PyCharm的Debug调试模式下分析Django模板引擎的运行过程。打开函数render所在的源码文件,变量content是模板文件的解析结果,它是由函数render_to_string完成解析过程的如图6-6所示。

    def render(request, template_name, context=None, content_type=None, status=None, using=None):"""Return an HttpResponse whose content is filled with the result of callingdjango.template.loader.render_to_string() with the passed arguments."""content = loader.render_to_string(template_name, context, request, using=using)return HttpResponse(content, content_type, status)
    
  • 想要分析Diango模板引擎的解析过程,还需要从函数 render_to_string 深入分析,通过PyCharm打开函数 render_to_string 的源码信息,发现它调用了函数 get_template 或 select_template,模板的解析过程:

    在这里插入图片描述

3 内置标签

  • 标签是对模板上下文进行控制输出,它是以 {% tag %} 表示的,其中tag是标签的名称,Django内置了许多模板标签,比如{% if %}(判断标签)、{% for %}(循环标签)或{% url %)(路由标签)等。

  • 内置的模板标签可以在Django源码(\django\template\defaulttags.py)中找到定义过程,每个内置标签都有功能注释和使用方法,本书只列举常用的内置标签:

    标签名称 语法 功能描述 示例
    if {% if condition %} ... {% elif condition %} ... {% else %} ... {% endif %} 条件判断,支持 and, or, not, ==, !=, >, <, >=, <= 等运算符 {% if user.is_staff %} Admin Panel {% else %} User Dashboard {% endif %}
    for {% for item in list %} ... {% empty %} ... {% endfor %} 迭代列表、查询集等可迭代对象,支持 forloop.counter, forloop.revcounter 等变量 {% for comment in post.comments %} { { comment.text }} {% empty %} No comments {% endfor %}
    csrf_token {% csrf_token %} 生成 CSRF 保护令牌,用于 POST 请求表单防跨站攻击 <form method="post">{% csrf_token %} <button>Submit</button> </form>
    url {% url 'view_name' arg1 arg2 %} 或 {% url 'app_name:view_name' %} 反向解析 URL 路径,避免硬编码 URL {% url 'blog:article_detail' article.slug %}
    load {% load static i18n %} 加载自定义或内置模板标签库(如 static, humanize, i18n 等) {% load static %}{% load custom_tags %}
    static {% static 'path/to/file.css' %} 生成静态文件的 URL 路径(需先 {% load static %} <link href="{% static 'css/style.css' %}" rel="stylesheet">
    extends {% extends "base.html" %} 声明模板继承关系,必须放在模板文件顶部 {% extends "layouts/main.html" %}
    block {% block block_name %} ... {% endblock %} 定义可被子模板覆盖的内容区块,常用于模板继承 {% block content %} Main content here {% endblock %}
    • 关键说明:
      1. 模板继承顺序extends 标签必须位于模板文件的第一行
      2. CSRF 保护:所有 POST 表单必须包含 csrf_token 标签
      3. 静态文件路径static 标签会自动添加 STATIC_URL 设置前缀
      4. URL 命名空间:推荐使用 app_name:view_name 格式避免命名冲突
      5. 循环变量for 标签内置 forloop 对象包含 counter, counter0, first, last 等属性

  • for 标签模板变量

    变量名称 描述 示例用法
    forloop.counter 当前循环的迭代次数(从 1 开始) { { forloop.counter }} 输出:1, 2, 3…
    forloop.counter0 当前循环的迭代次数(从 0 开始) { { forloop.counter0 }} 输出:0, 1, 2…
    forloop.revcounter 剩余迭代次数(从总数开始递减) 若总迭代 3 次,输出:3, 2, 1
    forloop.revcounter0 剩余迭代次数(从总数 - 1 开始递减) 若总迭代 3 次,输出:2, 1, 0
    forloop.first 当前是否为第一次迭代(布尔值) {% if forloop.first %} First item {% endif %}
    forloop.last 当前是否为最后一次迭代(布尔值) {% if forloop.last %} Last item {% endif %}
    forloop.parentloop 嵌套循环中引用父级循环的 forloop 对象 内层循环中使用 { { forloop.parentloop.counter }}

4 模板继承

  • 模板继承是通过模板标签来实现的,其作用是将多个模板文件的共同代码集中在一个新的模板文件中,然后各个模板可以直接调用新的模板文件,从而生成HTML网页,这样可以减少模板之间重复的代码。

    {% extends 'base.html' %}
    {% block title %}
    <title>首页</title>
    {% endblock %}{% block body %}<a href="{% url 'index:index' %}">首页</a><h1>Hello,Django</h1>
    {% endblock %}
    
  • 模板的继承与Python的类继承原理是一致的,通过继承方式使得其具有父类的功能和属性,同时也可以通过重写来实现更加复杂的开发需求。

5 内置过滤器

  • 过滤器主要是对上下文的内容进行操作,如:替换、反序和转义等。通过过滤器处理上下文可以将其数据格式或内容转化为我们想要的显示效果,而且可以相应地减少视图的代码量。过滤器的使用方法如下:

    • { { variable | filter }}
  • 若上下文设有过滤器,则模板引擎在解析上下文时,首先由过滤器 filter 处理上下文variable,然后对处理后的结果进行解析并显示在网页上。variable代表模板上下文,管道符号 “|” 代表当前上下文使用过滤器,filter代表某个过滤器。单个上下文可以支持多个过滤器同时使用,例如:

    • { { variable | filter | lower})
  • 在使用的过程中,有些过滤器还可以传入参数,但仅支持传入一个参数。带参数的过滤器与参数之间使用冒号隔开,并且两者之间不能留有空格,例如:

    • { { variable | date:“D d M Y”}}
  • Django的内置过滤器可以在源码(\django\template\defaultfilters.py) 中找到具体的定义过程:

    过滤器名称 语法 功能描述 示例
    length `value length` 返回字符串或列表的长度
    default `value default:“N/A”` 若值为假(空字符串、None 等),返回默认值
    date `date_obj date:“Y-m-d”` 格式化日期时间对象,支持 Y, m, d, H, i, s, N 等格式代码
    upper / lower `text upper` 将字符串转换为大写 / 小写
    truncatewords `text truncatewords:3` 截断字符串为指定单词数,超出部分用省略号表示
    safe `html safe` 标记字符串为安全 HTML,避免自动转义
    add `num add:5` 数值相加(或字符串拼接)
    join `list join:", "` 类似 Python 的 join() 方法,将列表元素连接为字符串
    filesizeformat `bytes filesizeformat` 将字节数格式化为人类可读的文件大小(KB、MB 等)
    slice `list slice:“:2”` 切片操作,类似 Python 的 [:2]
    linebreaks `text linebreaks` 将换行符转换为 HTML 的 <br><p> 标签
    yesno `bool yesno:“Y,N,?”` 将布尔值转换为自定义文本(是 / 否 / 未知)
    divisibleby `num divisibleby:2` 判断数值是否能被整除(返回布尔值)
    floatformat `num floatformat:2` 格式化浮点数,指定小数位数(四舍五入)
    urlencode `text urlencode` 将字符串编码为 URL 安全格式
  • 补充说明:

    1. 链式过滤器:可组合使用多个过滤器,如 { { value|lower|truncatewords:5 }}
    2. 安全注意:使用 safe 过滤器时需确保内容来源安全,避免 XSS 攻击
    3. 自定义过滤器:可通过 {% load %} 标签加载自定义过滤器库
  • 注意

    • 使用过滤器过程中,上下文、管道符号 “|” 和 过滤器之间没有规定使用空格隔开。为了符合编码的规范性,建议使用空格隔开。
    • 若过滤器需要设置参数,过滤器、冒号和参数之间不能有供果,否则会提示:TemplateSyntaxError

6 自定义异常页面

  • 网站异常是一个普遍现象,常见的异常以 404 和 500 为主,出现异常的网站自身数据缺陷或不合理的非法访问导致,

  • 实现自定义异常页面,操作如下:

    1. 在你的项目模板目录下(通常是 templates/)创建以下两个模板文件:

      • 404.html(处理未找到页面)

      • 500.html(处理服务器内部错误)

        <!-- templates/404.html -->
        <!DOCTYPE html>
        <html>
        <head><title>404 - 页面未找到</title>
        </head>
        <body><h1>页面不存在</h1><p>你请求的页面不存在,请检查URL或返回<a href="/">首页</a></p>
        </body>
        </html><!-- templates/500.html -->
        <!DOCTYPE html>
        <html>
        <head><title>500 - 服务器错误</title>
        </head>
        <body><h1>服务器开小差了</h1><p>我们正在修复问题,请稍后再试。</p>
        </body>
        </html>
        
    2. 配置 URL 处理函数(可选)

      • Django 默认会自动处理 404 和 500 错误,但如果你需要自定义处理逻辑,可以在项目的 urls.py 中添加:

        # project/urls.py
        from django.conf.urls import handler404, handler500
        from django.contrib import admin
        from django.urls import pathurlpatterns = [path('admin/', admin.site.urls),# 其他URL配置...
        ]# 指定错误处理视图
        handler404 = 'your_app.views.custom_404'
        handler500 = 'your_app.views.custom_500'
        
    3. 创建自定义视图函数(可选)

      • 如果你在第 2 步中指定了自定义处理函数,需要在对应应用的 views.py 中实现:

        # your_app/views.py
        from django.shortcuts import renderdef custom_404(request, exception):return render(request, '404.html', status=404)def custom_500(request):return render(request, '500.html', status=500)
        
  • 注意

    1. DEBUG 模式:仅在 DEBUG=False 时才会显示自定义错误页面
    2. 500 错误处理handler500 不接收 exception 参数,因为服务器错误可能无法提供具体异常信息
    3. 静态文件:确保错误页面不依赖动态数据,避免在出错时引发更多问题

7 基础模板设计

  • 从网页静态界面看到,所有网页(除了登录页外)的顶部都是相同的,包含商品搜索功能和网站导航

    在这里插入图片描述

  • 由于每个网页的顶部都相同,也就是说这部分的HTML代码是完全相同的,因此我们可以将这部分代码单独抽取出来并放置在一

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89738.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89738.shtml

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

相关文章

Redis常见线上问题

文章目录 Redis常见线上问题 引言 报告背景与目的 Redis版本与环境说明 性能瓶颈问题 慢查询分析与优化 高CPU与网络延迟 内存管理问题 内存碎片成因与优化 BigKey与内存溢出 数据一致性与高可用问题 主从同步延迟 脑裂问题与解决方案 持久化机制问题 RDB与AOF对比 核心特性对比…

Typecho博客集成阿里云CDN+OSS实现全站加速方案

文章目录 Typecho博客系统集成阿里云CDN和OSS实现静态资源加速 引言 一、技术选型与准备工作 1.1 为什么选择阿里云CDN+OSS组合 1.2 准备工作 二、OSS存储桶创建与配置 2.1 创建OSS存储桶 2.2 配置Bucket权限 2.3 配置跨域访问(CORS) 三、CDN加速配置 3.1 添加CDN域名 3.2 配置…

计算机毕业设计Java网咖管理系统 Java技术实现的网咖综合管理系统开发 基于Spring Boot框架的网咖运营管理系统设计

计算机毕业设计Java网咖管理系统e0btvq7l &#xff08;配套有源码 程序 mysql数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联xi 可分享随着互联网技术的飞速发展和电子竞技的全球兴起&#xff0c;网咖作为一种新兴的休闲娱乐场所&#xff0…

Kotlin main函数

main() 函数 来仔细看看 main() 函数。实际上&#xff0c;它就是一个很常见的函数&#xff1a;你可以对它做任何你能对普通函数做的事。唯一的不同是&#xff1a;它是程序的入口点&#xff08;entry point&#xff09;。这意味着程序的执行从调用这个函数开始。 我们来拆解一下…

深入理解 Spring:事务管理与事件机制全解析

文章目录前言一、Spring 事务管理&#xff08;Transaction Management&#xff09;1. 使用 Transactional 管理事务2. 核心属性说明3. 事务传播行为详解&#xff08;Propagation&#xff09;4. 异常回滚策略分析5. 底层原理剖析&#xff08;源码级&#xff09;二、Spring 事件机…

AWD练习的平台搭建

ubuntu虚拟机搭建 前提资源准备 进行AWD我们需要在一个独立的虚拟机 现在就来搭建一个ubuntu的 这里我们使用的VMware是17的 然后下载镜像的地址&#xff1a;Ubuntu最全的国内镜像下载地址 - 哔哩哔哩 我下载的是中科大的 这里需要准备的前提资源就有了。 创建Ubuntu虚…

C++ 详谈继承体系下的构造函数和析构函数

前言 前面呢, 我们说了C中实现多态的原理, 其中也说了, 虚函数表和虚函数指针的创建时机, C 详谈多态实现原理-CSDN博客 , 这一节呢, 我们会说说在C中继承体系下的另一个知识点, 那就是: 继承体系下的构造函数和析构函数~~, 主要围绕两个问题: 执行顺序? 虚析构函数的作用? …

PostgreSQL 字段类型速查与 Java 枚举映射

1. 查询 SQLSELECTc.table_schema,c.table_name,c.column_name,c.data_type,c.udt_name,CASE-- 数值WHEN c.udt_name IN (int2,int4,int8,float4,float8,numeric,money)THEN NUMERIC-- 布尔WHEN c.udt_name boolTHEN BOOLEAN-- 日期/时间WHEN c.udt_name IN (date,time,timetz…

数据分析综合应用 30分钟精通计划

🔬 数据分析综合应用 30分钟精通计划(完整版含输出) ⏰ 时间分配 5分钟:数据加载与清洗基础 10分钟:探索性数据分析(EDA) 10分钟:数据分析实战案例 5分钟:分析报告生成 📚 第一部分:数据加载与清洗基础 (5分钟) 1. 模拟真实数据集 import pandas as pd import nu…

Python爬虫实战:研究psd-tools库相关技术

一、引言 1.1 研究背景 Adobe Photoshop 是目前最流行的图像处理软件之一,其原生文件格式 PSD(Photoshop Document)包含了丰富的图像信息和编辑历史。PSD 文件不仅在设计领域广泛使用,还在数字营销、版权保护和安全分析等领域具有重要价值。然而,手动分析大量 PSD 文件是…

基于卷积傅里叶分析网络 (CFAN)的心电图分类的统一时频方法

一、研究背景与核心问题​​ECG分类的挑战​&#xff1a;心电图&#xff08;ECG&#xff09;信号分类在心律失常检测、身份识别等领域至关重要&#xff0c;但传统方法难以同时有效整合时域和频域信息。现有方法包括&#xff1a;​时域分类&#xff08;CNN1D&#xff09;​​&am…

Linux——LinuxOS

cd,pwd,mkdir,rm,ls,touch,cat,echo,

深度学习篇---矩阵

在机械臂解算、深度学习网络等硬件和软件领域中&#xff0c;矩阵运算作为核心数学工具&#xff0c;承担着数据表示、变换、映射和优化的关键作用。以下从具体领域出发&#xff0c;详细总结涉及的矩阵运算及对应的核心知识&#xff1a;一、机械臂解算领域机械臂解算&#xff08;…

元宇宙:技术乌托邦与数字化未来——基于技术哲学的分析

一、技术哲学视域下的元宇宙本质哲学源流与技术基因的双重映射理想世界的千年回响&#xff1a;从柏拉图洞穴隐喻中的影子世界&#xff0c;到普特南“钵中之脑”对虚拟与现实界限的消弭&#xff0c;元宇宙的构想深植于人类对平行世界的永恒追问。中国传统神话中“天人二元结构”…

如何构建一个基于大模型的实时对话3D数字人?

近年来&#xff0c;随着元宇宙和AIGC技术的爆发&#xff0c;3D数字人从影视特效走向日常应用。无论是虚拟主播、AI客服&#xff0c;还是数字教师&#xff0c;其核心诉求都是**“能听、会说、有表情”**的实时交互能力。本文就带大家了解如何构建一个基于大模型的实时对话的3D数…

NULL值处理:索引优化与业务设计实践指南

一、NULL值的本质与影响NULL值在数据库中代表"未知状态"或"不适用"的特殊标记&#xff0c;与空字符串或0有本质区别12。其特性导致以下业务与性能问题&#xff1a;‌语义复杂性‌&#xff1a;NULL可能表示"未填写"(如用户手机号)或"不适用&…

【add vs commit】Git 中的 add 和 commit 之间的区别

关于git add和git commit还有一些有点不太清楚的地方&#xff0c;这里写一篇文章好好理一理git add&#xff1a;添加到暂存区 git add实际上是把工作区中的内容存入“暂存区” 通俗来讲就是告诉Git&#xff1a;“这些文件我准备好commit了” git add file.txt # 添加单个文件 …

【推荐100个unity插件】使用C#或者unity实现爬虫爬取静态网页数据——Html Agility Pack (HAP)库和XPath 语法的使用

文章目录前言一、安装HtmlAgilityPack1、从NuGet下载HtmlAgilityPack包2、获取HtmlAgilityPack.dll二、HtmlAgilityPack常用操作1、加载 HTML2、查询方式2.1 使用 XPath 查询&#xff08;推荐&#xff09;2.2 使用 LINQ 查询3、常用查询操作3.1 选择节点3.2 获取属性值3.3 遍历…

用 urllib 开启爬虫之门:从零掌握网页数据抓取

在数字时代&#xff0c;数据就是力量。作为一名社会工作者&#xff0c;或许你想了解城市服务资源&#xff1b;作为一个编程初学者&#xff0c;你可能希望从网页中自动提取新闻、课程或公开数据。今天&#xff0c;我们就来讲一讲 Python 标准库中的一把“钥匙”——urllib 库&am…

Spring Boot 订单超时自动取消的 3 种主流实现方案

Spring Boot 订单超时自动取消的 3 种主流实现方案关键词&#xff1a;Spring Boot、订单超时、延迟任务、RabbitMQ、Redis、定时任务在电商、外卖、票务等业务中&#xff0c;“下单后若 30 分钟未支付则自动取消”是一道经典需求。实现方式既要保证 实时性&#xff0c;又要在 高…