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
英文地址,請注明出處:http://en.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;又要在 高…