Python Django 模版全解與實戰

来源:https://www.cnblogs.com/xfuture/archive/2023/07/08/17537479.html
-Advertisement-
Play Games

**本文首先介紹了Django模板系統的基礎知識,接著探討瞭如何安裝和配置Django模板系統,然後深入解析了Django模板的基本結構、標簽和過濾器的用法,闡述瞭如何在模板中展示模型數據,最後使用一個實際項目的例子來演示如何在實際開發中使用Django模板系統。** ## Django模板系統的簡 ...


本文首先介紹了Django模板系統的基礎知識,接著探討瞭如何安裝和配置Django模板系統,然後深入解析了Django模板的基本結構、標簽和過濾器的用法,闡述瞭如何在模板中展示模型數據,最後使用一個實際項目的例子來演示如何在實際開發中使用Django模板系統。

Django模板系統的簡介

Django模板系統是一個強大的組件,它允許我們根據所提供的數據動態生成HTML、XML等結構化文本。模板系統不僅易於使用,且功能豐富。它包括一個內置的語言:Django模板語言 (DTL),這是一種簡單、非侵入式的語言,用於定義模板的結構和邏輯。

例如,在一個Django模板中,我們可以使用變數和標簽來動態地生成內容:

# Django模板示例
{{ book.title }} <!-- 輸出: Python編程基礎 -->
{% if user.is_authenticated %} <!-- 如果用戶已登錄 -->
  Hello, {{ user.username }}! <!-- 輸出: Hello, John! -->
{% endif %}

以上代碼中,花括弧{{ }}用於輸出變數的值,標簽{% %}用於執行邏輯操作。


模板的基本結構

Django模板是由一系列特殊的語法構成的文本文件,用於動態生成HTML、XML或其他標記語言。下麵我們來詳細瞭解一下Django模板的基本結構。

模板語法

Django模板主要使用兩種語法:

  • 變數:用雙大括弧({{ }})包裹。比如{{ variable }},Django將會將其替換為變數的值。
  • 標簽:用大括弧和百分號({% %})包裹。標簽提供了模板的控制結構,比如迴圈、條件語句等。比如{% for item in list %}...{% endfor %}

模板繼承

Django模板系統支持模板繼承。這是一種DRY(Don't Repeat Yourself)的設計原則。你可以定義一個基礎模板(base template),然後讓其他模板繼承這個基礎模板並覆蓋其中的某些部分。

例如,定義一個基礎模板base.html

<!-- base.html -->
<html>
<body>
{% block content %}{% endblock %}
</body>
</html>

然後,定義一個子模板child.html,繼承base.html並覆蓋content塊:

<!-- child.html -->
{% extends "base.html" %}

{% block content %}
<p>Hello, Django!</p>
{% endblock %}

其他模板

除了繼承,Django模板還支持包含(include)其他模板,這可以幫助你將模板分解為小的、可重用的部分。

例如,定義一個模板header.html

<!-- header.html -->
<header>
  <h1>Welcome to My Website</h1>
</header>

然後,在另一個模板中包含這個模板:

{% include "header.html" %}

<p>This is the main content...</p>

配置Django模板

配置Django模板系統

Django模板系統預設已經被包含在Django項目中。你可以在項目的settings.py文件中找到模板的配置信息:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        ...
    },
]

你可以在'DIRS'配置項中添加模板的路徑。預設情況下,Django會在每個應用的templates目錄下查找模板文件。

配置模板載入方式

Django模板系統可以從多個位置載入模板。預設情況下,Django會在每個應用的templates目錄下查找模板文件。你可以通過修改TEMPLATES配置中的'DIRS'選項來添加其他模板目錄。例如,你可以添加一個全局的模板目錄:

# settings.py

import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    },
]

在此配置中,所有的模板文件都會在項目根目錄下的templates文件夾中查找。

配置模板引擎

TEMPLATES配置中,'BACKEND'選項用於指定使用哪個模板引擎。Django預設使用的是自帶的模板引擎,即django.template.backends.django.DjangoTemplates。你也可以切換到其他模板引擎,例如Jinja2:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        ...
    },
]

註意,不同的模板引擎可能需要不同的配置,並且提供的模板語言也可能不同。

配置自定義模板標簽和過濾器

如果你有自定義的模板標簽和過濾器,你需要把它們放在某個應用下的templatetags目錄中。然後在INSTALLED_APPS配置中添加該應用,Django就會自動載入你的自定義模板標簽和過濾器:

# settings.py

INSTALLED_APPS = [
    ...
    'myapp',
    ...
]

模板標簽詳解

Django模板系統中的標簽(Tags)提供了各種控制結構,包括迴圈、條件語句、模板繼承等。接下來我們詳細介紹一些常用的標簽。

for標簽

for標簽用於在模板中迴圈遍歷序列:

{% for item in item_list %}
    <p>{{ item.name }}</p> <!-- 輸出每個項目的名稱 -->
{% endfor %}

if標簽

if標簽用於條件判斷。你可以使用elifelse進行多分支判斷:

{% if user.is_authenticated %}
    <p>Welcome back, {{ user.username }}.</p> <!-- 如果用戶已經認證,列印歡迎信息 -->
{% else %}
    <p>Please log in.</p> <!-- 如果用戶未認證,提示用戶登錄 -->
{% endif %}

extends標簽和block標簽

extends標簽用於模板繼承,block標簽用於定義可被子模板覆蓋的區塊:

<!-- base.html -->
<html>
<body>
{% block content %}{% endblock %}
</body>
</html>

<!-- child.html -->
{% extends "base.html" %}

{% block content %}
<p>Hello, Django!</p>
{% endblock %}

include標簽

include標簽用於包含其他模板,使得模板可重用:

{% include "header.html" %}

url標簽

url標簽用於生成URL。它接受一個視圖函數的名稱或URL模式的名稱,以及可選的參數,然後返回對應的URL:

<a href="{% url 'home' %}">Home</a> <!-- 生成首頁的URL -->

csrf_token標簽

在使用POST表單時,csrf_token標簽用於生成CSRF令牌,以防止跨站請求偽造攻擊:

<form method="post">
{% csrf_token %}
<!-- 表單內容 -->
</form>

模板過濾器

在Django模板中,過濾器可以在變數被顯示之前對其進行修改。過濾器的語法是在變數名後面添加一個豎線(|)和過濾器的名稱。如果過濾器需要參數,可以使用冒號(:)添加。讓我們詳細瞭解一下。

基本使用

比如,我們可以使用date過濾器來格式化日期:

{{ date_var|date:"F j, Y" }} <!-- 輸出: July 8, 2023 -->

使用lower過濾器將文本轉換為小寫:

{{ "Hello World"|lower }} <!-- 輸出: hello world -->

鏈接過濾器

你還可以鏈接多個過濾器,他們會按照從左到右的順序執行:

{{ "Hello World"|lower|capfirst }} <!-- 輸出: Hello world -->

自定義過濾器

除了使用Django內置的過濾器,你還可以創建自己的過濾器。為此,你需要在某個應用下的templatetags目錄中創建一個Python文件,然後在其中定義你的過濾器函數,並使用register.filter裝飾器註冊它:

from django import template

register = template.Library()

@register.filter
def my_filter(value):
    # 這是一個簡單的過濾器,它返回值的第一個字元
    return value[0]

然後你就可以在模板中使用這個過濾器了:

{{ "Hello World"|my_filter }} <!-- 輸出: H -->

Django模板中展示模型數據

Django框架將模型數據和模板視圖分離,這讓我們在模板中方便地展示模型數據。在視圖函數中,我們可以查詢模型數據,然後將它傳遞給模板。在模板中,我們使用特殊的語法來訪問和展示這些數據。

在視圖中準備數據

假設我們有一個Blog模型,它有一個title欄位和一個content欄位。在我們的視圖函數中,我們可以查詢所有的博客:

from django.shortcuts import render
from .models import Blog

def blog_list(request):
    blogs = Blog.objects.all()  # 查詢所有的博客
    return render(request, 'blog_list.html', {'blogs': blogs})

在模板中展示數據

然後,在我們的blog_list.html模板中,我們可以使用for標簽來遍歷所有的博客,並使用變數語法來展示每個博客的標題和內容:

{% for blog in blogs %}
<h2>{{ blog.title }}</h2>  <!-- 展示博客標題 -->
<p>{{ blog.content }}</p>  <!-- 展示博客內容 -->
{% endfor %}

使用過濾器格式化數據

在模板中,我們還可以使用過濾器來對模型數據進行格式化。例如,我們可以使用date過濾器來格式化日期,或者使用truncatechars過濾器來限制文本的長度:

{% for blog in blogs %}
<h2>{{ blog.title }}</h2>
<p>{{ blog.publish_date|date:"F j, Y" }}</p>  <!-- 使用date過濾器格式化發佈日期 -->
<p>{{ blog.content|truncatechars:100 }}</p>  <!-- 使用truncatechars過濾器限制內容長度 -->
{% endfor %}

在實際的項目中使用Django模板

Django模板系統在實際的項目開發中扮演著重要的角色。下麵我們就以一個簡單的博客系統作為例子,演示如何在實際項目中使用Django模板。

第一步:定義你的模型

首先,我們需要在我們的應用中定義一個模型。在這個例子中,我們定義一個Post模型來表示博客文章:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)  # 文章標題
    content = models.TextField()  # 文章內容
    pub_date = models.DateTimeField(auto_now_add=True)  # 發佈日期

第二步:創建視圖

接著,我們需要創建一個視圖來處理用戶的請求。在這個視圖中,我們可以獲取所有的博客文章,並將它們傳遞給模板:

from django.shortcuts import render
from .models import Post

def post_list(request):
    posts = Post.objects.all()  # 獲取所有的博客文章
    return render(request, 'blog/post_list.html', {'posts': posts})  # 將文章傳遞給模板

第三步:編寫模板

然後,我們可以創建一個模板來展示博客文章。在這個模板中,我們使用for標簽來遍歷所有的文章,並使用變數來展示文章的標題和內容:

{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{ post.content }}</p>
<p>Published on {{ post.pub_date|date:"F j, Y" }}</p>
{% endfor %}

第四步:配置URLs

最後,我們需要在urls.py文件中配置URL,使得用戶可以訪問我們的視圖:

from django.urls import path
from . import views

urlpatterns = [
    path('posts/', views.post_list, name='post_list'),  # 當用戶訪問/posts/時,顯示博客文章列表
]

以上就是在實際項目中使用Django模板的基本步驟。通過這個例子,我們可以看到Django模板系統的強大和靈活性,它可以幫助我們快速地創建動態的網頁。


如有幫助,請多關註
個人微信公眾號:【Python全視角】
TeahLead_KrisChang,10+年的互聯網和人工智慧從業經驗,10年+技術和業務團隊管理經驗,同濟軟體工程本科,復旦工程管理碩士,阿裡雲認證雲服務資深架構師,上億營收AI產品業務負責人。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 有一段時間,在B站那裡刷視頻的時候,無意刷到一個德生的收音機視頻。突然讓我想起了我的中學時代,我的中學時代是在收音機的陪伴之下成長的。那個時候,主要的想法是為了收聽短波的英文電臺,美名日學習英語。不過那個時候,能清晰聽到的英文廣播電臺並不多,更多的是外國播放的中文廣播電臺,而這些電臺大多數是說國內的 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 介紹 今天介紹一個非常簡單的入門級小案例,就是地圖的捲簾效果實現,各大地圖引擎供應商都有相關示例,很奇怪高德居然沒有,我看了下文檔發現其實也是可以簡單實現的,演示代碼放到文末。本文用到了圖層掩模,即圖層遮罩,讓圖層只在指定範圍內顯示。 實 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 背景 因為我們日常開發項目的時候,需要和同事對接api和文檔還有UI圖,所以有時候要同時打開多個視窗,併在多個視窗中切換,來選擇自己要的信息,如果api和文檔不多的情況還好,但是有時候就是要做大量的頁面,為了提升效率我決定自己做一個截圖工 ...
  • 一. 源碼展示: 1. Object.equals: ①引用類型地址值比較,直接返回結果:true || false public class Object { public boolean equals(Object obj) { return (this == obj); } } 2. Stri ...
  • ## 1.1 概述 > 說白了就是鍵值對的映射關係 > > 不會丟失數據本身關聯的結構,但不關註數據的順序 > > 是一種可變類型 ```py 格式:dic = {鍵:值, 鍵:值} ``` * 鍵的類型:字典的鍵可以是任何不可變的類型,如浮點數,字元串,元組 ## 1.2 函數dict 可以從其他 ...
  • ### 目錄 *1:什麼是AQS?* *2:AQS都有那些用途?* *3:我們如何使用AQS* *4:AQS的實現原理* *5:對AQS的設計與實現的一些思考* ### 1:什麼是AQS ​ 隨著電腦的算力越來越強大,各種各樣的並行編程模型也隨即踴躍而來,但當我們要在並行計算中使用共用資源的時候, ...
  • 電腦COM口數據測試一、基本使用流程 程式需要以管理員身份運行,COM口迴路測試需短接2,3pin,測試時候使用控制台,配置測試相關路徑,併在測試完成後 1.測試配置路徑D:\bigdata\INI\FWCOM.ini 2.測試完成後需要在路徑D:\bigdata\LOG\生成測試FWCOM.lo ...
  • # C++ 慣用法之 Copy-Swap 拷貝交換 > 這是“C++ 慣用法”合集的第 3 篇,前面 2 篇分別介紹了 RAII 和 PIMPL 兩種慣用法: > > - [RAII: Resouce Acquistion Is Initialization](https://www.cnblogs ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...