本文首先介紹了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
標簽用于條件判斷,你可以使用elif
和else
進行多分支判斷:
{% 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="https://www.cnblogs.com/xfuture/p/{% 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產品業務負責人,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556828.html
標籤:Python
下一篇:返回列表