Python知識分享網 - 專業(yè)的Python學習網站 學Python,上Python222
Python Django 模版全解與實戰(zhàn)
匿名網友發(fā)布于:2023-07-10 12:58:49
(侵權舉報)

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

 

Django模板系統(tǒng)的簡介

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

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

 

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

 

以上代碼中,花括號{{ }}用于輸出變量的值,標簽{% %}用于執(zhí)行邏輯操作。


 

模板的基本結構

Django模板是由一系列特殊的語法構成的文本文件,用于動態(tài)生成HTML、XML或其他標記語言。下面我們來詳細了解一下Django模板的基本結構。

 

模板語法

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

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

 

模板繼承

Django模板系統(tǒng)支持模板繼承。這是一種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模板系統(tǒng)

Django模板系統(tǒng)默認已經被包含在Django項目中。你可以在項目的settings.py文件中找到模板的配置信息:

 

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

 

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

 

配置模板加載方式

Django模板系統(tǒng)可以從多個位置加載模板。默認情況下,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模板系統(tǒng)中的標簽(Tags)提供了各種控制結構,包括循環(huán)、條件語句、模板繼承等。接下來我們詳細介紹一些常用的標簽。

 

for標簽

for標簽用于在模板中循環(huán)遍歷序列:

 

{% 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標簽用于定義可被子模板覆蓋的區(qū)塊:

 

<!-- 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。它接受一個視圖函數(shù)的名稱或URL模式的名稱,以及可選的參數(shù),然后返回對應的URL:

 

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

 

csrf_token標簽

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

 

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

 

模板過濾器

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

 

基本使用

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

 

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

 

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

 

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

 

鏈接過濾器

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

 

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

 

自定義過濾器

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

 

from django import template

register = template.Library()

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

 

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

 

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

 

Django模板中展示模型數(shù)據

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

 

在視圖中準備數(shù)據

假設我們有一個Blog模型,它有一個title字段和一個content字段。在我們的視圖函數(shù)中,我們可以查詢所有的博客:

 

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})

 

在模板中展示數(shù)據

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

 

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

 

使用過濾器格式化數(shù)據

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

 

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

 

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

Django模板系統(tǒng)在實際的項目開發(fā)中扮演著重要的角色。下面我們就以一個簡單的博客系統(tǒng)作為例子,演示如何在實際項目中使用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)  # 發(fā)布日期

 

第二步:創(chuàng)建視圖

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

 

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})  # 將文章傳遞給模板

 

第三步:編寫模板

然后,我們可以創(chuàng)建一個模板來展示博客文章。在這個模板中,我們使用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模板系統(tǒng)的強大和靈活性,它可以幫助我們快速地創(chuàng)建動態(tài)的網頁。

轉載自:https://www.cnblogs.com/xfuture/p/17537479.html