Django 模板語言:標簽和過濾器

      網友投稿 741 2025-03-31

      目錄

      創建 django 項目

      準備使用 django 模板

      編譯和渲染 Django 模板

      配置 Django 以加載文件模板

      從文件加載 Django 模板

      選擇模板語言

      學習 Django 模板、標簽和過濾器

      Django 模板標簽和過濾器

      模板繼承和包含

      探索通用模板標簽

      條件代碼

      循環

      注釋

      特殊的角色

      日期和時間

      網址

      探索關鍵模板過濾器

      字符串過濾器

      列出過濾器

      日期和時間過濾器

      第三方標簽和過濾器庫

      結論

      Django是一個強大的框架,用于在 Python 中創建 Web 應用程序。它的功能包括數據庫模型、路由 URL、身份驗證、用戶管理、管理工具和模板語言。您可以編寫可重用的 HTML,這些 HTML 會根據您傳遞給模板語言的數據進行更改。Django 模板使用標簽和過濾器來定義一種類似于 Python 但不是 Python 的迷你語言。

      您將通過用于編寫可重用 HTML 的標簽和過濾器來了解 Django 模板。

      在本教程中,您將學習如何:

      編寫、編譯和呈現Django 模板

      使用視圖中的render()快捷方式快速使用模板

      為模板中的條件和循環使用模板標簽

      創建具有繼承和包含功能的可重用模板

      通過模板過濾器修改數據的呈現方式

      創建 Django 項目

      要試驗 Django 模板,您將需要一個項目,以便您可以使用代碼。您將構建 MoviePalace:世界上最小、最簡單的電影網站。有關啟動新項目的更詳細示例,您可以閱讀Django 入門第 1 部分:構建投資組合應用程序。

      Django 不是標準 Python 庫的一部分,因此您首先需要安裝它。在處理第三方庫時,您應該使用虛擬環境。要復習虛擬環境,您可以閱讀Python Virtual Environments: A Primer。

      一旦你有了一個虛擬環境,運行以下命令開始:

      1$ python -m pip install django==3.2.5 2$ django-admin startproject MoviePalace 3$ cd MoviePalace 4$ python manage.py startapp core

      第 1 行使用pip.?在第 2 行,該django-admin命令創建了一個名為 的新 Django 項目MoviePalace。Django 項目由應用程序組成,您的代碼就在其中。第四個命令創建一個名為core.

      你幾乎準備好了。最后一步是將您新創建的core應用程序告訴 Django?。您可以通過編輯MoviePalace/settings.py文件并將其添加"core"到以下列表中來完成此操作INSTALLED_APPS:

      33INSTALLED_APPS = [ 34 "django.contrib.admin", 35 "django.contrib.auth", 36 "django.contrib.contenttypes", 37 "django.contrib.sessions", 38 "django.contrib.messages", 39 "django.contrib.staticfiles", 40 "core", 41]

      隨著core注冊為一個應用程序,你現在就可以編寫包含模板的視圖。

      準備使用 Django 模板

      Django 是在一家報紙上創建的,用于幫助快速構建 Web 應用程序。該框架的目標之一是將業務邏輯的關注點與表示邏輯的關注點分開。

      Web 設計人員,而不是 Python 程序員,經常在論文中進行 HTML 開發。因此,開發人員決定不允許在模板語言中執行 Python。這一決定簡化了設計人員需要了解的內容,并出于安全原因對他們的代碼進行了沙盒處理。最終結果是一個單獨的迷你語言。這種方法與PHP 方法形成對比,后者將代碼直接嵌入到 HTML 中。

      編譯和渲染 Django 模板

      Django 模板允許您在渲染上下文中動態更改輸出內容。您可以將模板視為套用信函,其中信函的內容包括可以插入信息的位置。您可以使用不同的數據多次運行渲染過程,每次都會得到不同的結果。

      Django 提供Template和Context類來表示正在呈現的字符串模板和在生成過程中使用的數據。的Context類是一個包裝到一個dict和提供鍵-值對來填充所生成的內容。渲染模板的結果可以是任何文本,但通常是 HTML。畢竟,Django是一個 Web 框架。

      是時候構建您的第一個模板了。要查看實際操作,您首先需要一個視圖。將以下代碼添加到core/views.py:

      1# core/views.py 2from django.http import HttpResponse 3from django.template import Context, Template 4 5def citizen_kane(request): 6 content = """{{movie}} was released in {{year}}""" 7 template = Template(content) 8 context = Context({"movie": "Citizen Kane", "year": 1941}) 9 10 result = template.render(context) 11 return HttpResponse(result)

      在此視圖中,您會看到構成 Django 模板語言的一些主要概念:

      第 6 行包含對movie和 的引用year。這類似于 Python?f-string。雙大括號或小胡子括號表示 Django 在呈現模板時替換的項目。

      第 7 行Template通過傳入指定模板的字符串來實例化一個對象。

      第 8 行Context通過用字典填充它來創建一個對象。該Context對象包含 Django 呈現模板時模板可用的所有數據。該模板包含兩個要替換的項目:{{movie}}with"Citizen Kane"和{{year}}with?1941。

      第 10行調用了.render()生成結果的方法。

      第 11 行返回包裝在HttpResponse對象中的渲染內容。

      要對此進行測試,您需要在瀏覽器中提供此視圖,因此您需要添加一個路由。修改MoviePalace/urls.py如下:

      # MoviePalace/urls.py from django.urls import path from core import views urlpatterns = [ path("citizen_kane/", views.citizen_kane), ]

      確保您使用的是安裝 Django 的虛擬環境,然后運行 Django 開發服務器查看結果:

      $ python manage.py runserver

      通過訪問運行您的視圖http://127.0.0.1:8000/citizen_kane/。

      該HttpResponse對象將此內容作為 HTML 返回,但由于字符串不包含任何標簽,您的瀏覽器會將其視為標簽內的文本。它返回格式錯誤的 HTML,但現在已經足夠使用了。如果一切順利,您應該會看到使用上下文中的數據呈現的模板:

      Citizen Kane was released in 1941

      您的模板已編譯,Django的替換movie和year變量與Citizen Kane和1941。

      配置 Django 以加載文件模板

      在 Web 應用程序中,您最可能使用的模板是輸出 HTML——大量的 HTML。Django 模板語言旨在簡化此過程。與前面的示例不同,您通常不會在視圖中使用模板字符串。相反,您從其他文件加載模板。

      要從磁盤加載模板,您首先需要告訴 Django 在哪里可以找到它。里面MoviePalace/settings.py,修改里面的"DIRS"值TEMPLATES:

      1TEMPLATES = [ 2 { 3 "BACKEND": "django.template.backends.django.DjangoTemplates", 4 "DIRS": [ 5 BASE_DIR / "templates", 6 ], 7 "APP_DIRS": True, 8 "OPTIONS": { 9 "context_processors": [ 10 "django.template.context_processors.debug", 11 "django.template.context_processors.request", 12 "django.contrib.auth.context_processors.auth", 13 "django.contrib.messages.context_processors.messages", 14 ], 15 },

      在命令創建的默認settings.py文件中django-admin,DIRS列表為空。Django 現在將在名為MoviePalace/templates.?請注意,Django 使用雙文件夾結構進行自己的配置。例如,settings.py在MoviePalace/MoviePalace.?模板的目錄應該在項目根目錄中,而不是在配置目錄中。

      當APP_DIRS第 7 行 is 時True,Django 還會在 app 子目錄中查找模板。Django 期望應用程序模板templates位于應用程序文件夾下命名的目錄中。

      在 Django 3.1 之前顯示隱藏

      您如何決定存儲模板的位置?如果您的應用程序可在其他項目中重復使用并且具有特定于它的模板,則將模板保留在應用程序中。否則,請將您的模板放在項目模板目錄中。有關如何構建 Django 項目的更多信息,請參閱 Django入門課程中有關 Django 雙文件夾結構的課程。

      對MoviePalace/settings.py文件進行更改后,不要忘記創建templates目錄:

      $ pwd /home/realpython/MoviePalace $ mkdir templates

      配置完成并創建目錄后,您現在可以從文件加載模板。

      從文件加載 Django 模板

      讓我們使用文件重建《公民凱恩》體驗。創建templates/simple.txt并添加citizen_kane()視圖中使用的模板字符串:

      {{movie}} was released in {{year}}

      您可以編寫代碼以將文件作為字符串加載、構建Template對象并執行您在citizen_kane()視圖中所做的相同操作,或者您可以使用render()快捷方式,它為您完成所有這些。將以下內容添加到您的core/views.py文件中:

      # core/views.py ? from django.shortcuts import render def casablanca(request): return render( request, "simple.txt", {"movie": "Casablanca", "year": 1942} )

      新視圖到位后,不要忘記添加一個路由到MoviePalace/urls.py:

      # MoviePalace/urls.py from django.urls import path from core import views urlpatterns = [ path("citizen_kane/", views.citizen_kane), path("casablanca/", views.casablanca), ]

      訪問http://127.0.0.1:8000/casablanca/應該產生與公民凱恩示例類似的結果:

      Casablanca was released in 1942

      該render()快捷方式呈現模板的常用方法。Template直接使用對象僅在極少數情況下完成,例如當您想為用戶提供模板的力量時。

      Template直接使用的一個示例可能是允許您的用戶輸入套用信函。套用信函可能包含變量,例如信函的收件人。通過允許用戶使用 Django 模板,您可以利用內置的變量替換機制來替換收件人的姓名。

      選擇模板語言

      Django 支持多種模板引擎。它附帶兩個:

      Django 模板語言:原始的 Django 模板語言,也是您在本教程中學習的語言

      Jinja2:以前是一個僅限第三方的庫,現在包含在 Django 中,但不在本教程的范圍內

      您可以通過編輯中的TEMPLATES值來更改使用的模板引擎MoviePalace/settings.py:

      1TEMPLATES = [ 2 { 3 "BACKEND": "django.template.backends.django.DjangoTemplates", 4 "DIRS": [ 5 BASE_DIR / "templates", 6 ], 7 "APP_DIRS": True, 8 "OPTIONS": { 9 "context_processors": [ 10 "django.template.context_processors.debug", 11 "django.template.context_processors.request", 12 "django.contrib.auth.context_processors.auth", 13 "django.contrib.messages.context_processors.messages", 14 ], 15 },

      第BACKEND3 行的設置是您指定渲染引擎的地方。您可以通過更改引擎BACKEND的虛線路徑模塊名稱來選擇 Django 模板引擎或 Jinja2引擎:

      django.template.backends.django.DjangoTemplates

      django.template.backends.jinja2.Jinja2

      第三方模板引擎也可用。使用它們需要通過安裝庫pip并將BACKEND值更改為引擎的虛線路徑名稱。

      本教程的其余部分將只關注原始 Django 模板后端,為您在 Django 項目中創建 HTML 奠定堅實的基礎。

      學習 Django 模板、標簽和過濾器

      到目前為止,您已經看到了包含簡單變量替換的模板。Django 模板語言比這更深入。除了 Python 自己的迷你語言之外,您可以訪問您在 Python 中習慣的許多結構和控件。

      Django 模板標簽和過濾器

      Django 模板語言具有三種控制渲染內容的方式:values、tags和filters。您放入模板中的所有內容都將按照您編寫的方式呈現。在本教程中,您將了解模板語言的三個主要部分:

      解釋的數據,你用雙大括號注明,{{ value }}

      Tags,你用大括號和百分號記下,{% tag_name %}

      過濾器,它修改解釋的數據,并使用管道運算符 (?|) 進行應用,例如{{ value | filter }}

      正如您在上一節中看到的,當 Django 將模板呈現為文本時,它使用一個名為Context.?上下文是模板呈現的狀態。除了包含要用雙大括號呈現的解釋數據之外,Context對象的內容還可用于進行邏輯決策。

      標簽就像模板語言的關鍵字和函數。在 Python 中,關鍵字和函數提供控制流和構建代碼的工具。同樣,Django 的內置標簽提供繼承、條件操作、循環、注釋和文本管理。例如,{% lorem %}標簽在渲染時被替換為示例lorem ipsum文本。

      Django 過濾器在雙大括號內運行,可讓您更改顯示數據的呈現方式。例如,date過濾器格式化一個日期時間對象,類似于strftime()Python 中的工作方式。如果Context字典包含datetime名為的對象today,{{ today | date:"Y"}}則將date過濾器應用于today,返回年份。

      本教程的其余部分將指導您了解常見的標簽和過濾器,并給出您如何使用它們的示例。

      模板繼承和包含

      HTML 中有很多樣板文件。大多數網站的每個頁面都有一個共同的外觀。呈現的每個頁面通常會重復相同的頁眉和頁腳,其中包括相同的樣式表,并且通常包括用于度量和測量的相同 JavaScript 文件。在每個頁面上手動重復此操作意味著進行更改將需要大量工作。模板繼承和包含來拯救你!

      有兩種方法可以將 Django 模板的各個部分組合在一起。繼承的工作方式類似于 Python 中的類繼承,模板覆蓋其父級的值。包含將內容從另一個模板注入到模板中。這類似于#includeC 編程語言中的指令。

      要查看這些操作,請創建templates/base.html:

      1 2 3 4 {% block heading %} 5

      Movie Palace

      6 {% endblock heading %} 7 8 {% block content %} 9 {% endblock content %} 10 11

      這個聲明就像面向對象編程中的基類。您可以單獨使用它,也可以設置其他模板來繼承它。如果此模板按原樣呈現,則{% block %}標簽的內容將按原樣顯示。在子級不覆蓋塊的情況下,這提供了有用的默認值。

      在base.html,有一個標題說

      Movie Palace

      ,沒有內容。當另一個模板從這個模板繼承時,魔法就會發生。在子模板中,您可以選擇覆蓋任何已定義的塊。一種常見的做法是用content頁面的內容填充塊,同時將樣板 HTML 留在此基本文件中。創建一個繼承自base.html被調用的模板templates/falcon.html:

      1 2{% extends "base.html" %} 3 4{% block heading %} 5 {{block.super}} 6

      The stuff that dreams are made of

      7{% endblock heading %} 8 9{% block content %} 10

      11 {% include "simple.txt" %} 12

      13{% endblock content %}

      該falcon.html文件顯示了兩件事:繼承和包含。您可以使用{% extends %}標記繼承父文件。這里,falcon.html繼承自base.html.?Djangobase.html完整地呈現文件,除非孩子falcon.html覆蓋了一個塊。例如, 中的content部分falcon.html覆蓋 中具有相同名稱的塊base.html。

      在block部分內部,定義了一個特殊變量:{{block.super}}。此變量包含父塊中的任何內容。在第 5 行,父塊引入了

      Movie Palace

      標題,而在第 6 行將falcon.html加入

      到塊中。

      除了繼承,還可以進行包含。在第 11 行,該{% include %}標簽插入了 的內容simple.txt。這允許您重用 HTML 片段。在這里,它重用了最初為casablanca()視圖定義的模板。

      要查看所有這些操作,您需要一個新視圖來呈現它們。在中創建以下內容core/views.py:

      # core/views.py ? def maltese_falcon(request): return render( request, "falcon.html", {"movie": "Maltese Falcon", "year": 1941}, )

      此視圖幾乎與 相同casablanca(),只是它渲染falcon.html并傳入適當的電影數據。MoviePalace/urls.py使用maltese_falcon視圖的路由更新您的文件,然后訪問該頁面:

      你覆蓋了標題,你包含了simple.txt,Django 用 Maltese Falcon 電影數據渲染了它。

      在 內部falcon.html,{% extends %}標簽對父模板的名稱進行了硬編碼。這是最常見的情況,但可以在上下文變量中命名父模板。這個技巧可以讓你在登錄和公共狀態下使用相同的子頁面,根據情況更改父模板。

      該falcon.html模板僅使用一級繼承,但您不僅限于此。孫子可以從子孫那里繼承,而子孫又可以從父母那里繼承。您可以根據需要擁有多個層來組織您的輸出。

      探索通用模板標簽

      您可以利用 Django 3.2.5 包含的超過 25 個內置標簽。這些標簽就像模板語言的關鍵字和功能。它們允許您執行條件邏輯、循環、繼承、文本操作等等。

      條件代碼

      在Python中,您使用if,elif和else關鍵字來有條件地執行代碼。在 Django 模板中,您可以使用標簽來完成同樣的事情。

      要查看這些標簽的實際效果,您需要一個包含更多數據的視圖。編輯您的core/views.py文件并添加以下函數:

      # core/views.py ? def psycho(request): data = { "movie": "Psycho", "year": 1960, "is_scary": True, "color": False, "tomato_meter": 96, "tomato_audience": 95, } return render(request, "psycho.html", data)

      為psychoto添加相應的路由MoviePalace/urls.py,然后創建templates/psycho.html:

      1 2{% extends "base.html" %} 3 4{% block content %} 5

      6 {{movie}} was released in {{year}}. It was {% if not is_scary %}not 7 {% endif %}scary. 8

      9 10

      11 {% if color %} 12 Color 13 {% else %} 14 Black and white 15 {% endif %} 16

      17 18

      19 {% if THX %} 20 Sound was awesome 21 {% endif %} 22

      23 24

      25 {% if tomato_meter > tomato_audience %} 26 Critics liked it better than audience 27 {% elif tomato_meter == tomato_audience %} 28 Critics liked it the same as audience 29 {% else %} 30 The audience liked it better than the critics 31 {% endif %} 32

      33 34

      Copyright MoviePalace

      35{% endblock content %}

      該{% if %}標簽的工作原理是Python的if關鍵字。如果測試的條件是True,則呈現塊。

      第 6 行到第 7 行顯示了使用內聯 if 條件,其is_scary值用not關鍵字取反。

      第 11 到 15 行顯示了多行 if 條件的使用。這個條件塊還包含一個{% else %}子句。if但是,與在 Python 中編寫語句不同的是,不要忘記結束{% endif %}標記。

      第 19 行檢查THXDjango 找不到的變量。一個不在上下文中的變量被考慮False,所以這個關于聲音質量的塊不會被渲染。

      第 25 到 31 行顯示了條件與布爾比較運算符的使用。您可以在標簽內使用在 Python 中使用的相同類型的運算符。

      如果你運行你的開發服務器并訪問視圖,你會注意到條件標簽已經起作用了:

      條件標記使您可以控制 HTML 塊的顯示,其功能與 Python 代碼中的條件部分相同。在psycho()視圖中處理數據,看看它如何改變條件塊的輸出。

      循環

      有一個用于循環的 Django 模板標簽:{% for %}.?它使用與 Pythonfor語句類似的語法,并提供一些內置變量,提供有關您在迭代中的位置的信息。

      到目前為止,電影視圖中的數據很少,沒有什么可以循環的。要使用循環,您需要向 中添加另一個視圖core/views.py:

      # core/views.py ? def listing(request): data = { "movies": [ ( "Citizen Kane", # Movie 1941, # Year ), ( "Casablanca", 1942, ), ( "Psycho", 1960, ), ] } return render(request, "listing.html", data)

      該視圖有一個名為 的上下文變量movies,它是一個列表。您將要構建的模板將使用循環標記來遍歷此列表。創建templates/listing.html如下:

      1 2{% extends "base.html" %} 3 4{% block content %} 5

      Movies

      6
        7 {% for movie in movies %} 8
      • 9 #{{forloop.counter}} {{movie.0}} was released in {{movie.1}} 10
      • 11 {% endfor %} 12
      13 14

      Goodies

      15
        16 {% for goodie in confectionaries %} 17
      • {{goodie.0}} — ${{goodie.1}}
      • 18 {% empty %} 19
      • There are no goodies available
      • 20 {% endfor %} 21
      22{% endblock content %}

      第 7 到 11 行包含一個{% for %}塊,類似于forPython 中的關鍵字。該塊迭代movies并分配一個movie在每個循環中命名的局部變量。在塊內部,您編寫 HTML,利用雙大括號對來顯示

    1. 標簽內的內容。

      第 8 行到第 10 行在每次迭代中重復一次。該循環使用了一個名為 的特殊對象forloop。這是 Django 在模板上下文中插入的局部變量。該對象有多個成員,每個成員都包含有關當前循環迭代的信息:

      讓我們再檢查一下循環塊內的行:

      7 8

    2. 9 #{{forloop.counter}} {{movie.0}} was released in {{movie.1}} 10
    3. 的內容movies是元組列表。每個元組包含電影的名稱和年份。Django 模板標簽不允許使用下標。不像在 Python 中那樣使用方括號訪問元組或列表中的值,而是使用數字作為對象的屬性。的值{{movie.0}}和{{movie.1}}是的第一和第二值movie元組。

      Django 循環還支持一個名為{% empty %}.?listing.html再次打開此標簽的示例:

      13 14{% for goodie in confectionaries %} 15

    4. {{goodie.0}} — ${{goodie.1}}
    5. 16{% empty %} 17
    6. There are no goodies available
    7. 18{% endfor %}

      這個標簽就像一個else子句。如果{% for %}標記中沒有任何內容可迭代,Django 將運行該{% empty %}塊。

      的{% empty %}標簽比纏繞更為方便{% for %}在一個塊{% if %}的塊,以實現相同的結果。在這種情況下,confectionaries上下文中沒有定義。Django 模板語言將缺失值視為空值,因此它呈現{% empty %}塊的一部分。

      在 中添加路由MoviePalace/urls.py,啟動 Django 開發服務器,然后訪問http://127.0.0.1:8000/listing/以查看結果:

      還支持另一種類似循環的標簽:{% cycle %}.?這個標簽接受一系列參數,并在每次調用時依次返回每個參數:

      {% for movie in movies %} ... {% endfor %}

      當{% cycle %}參數用完時,它會循環回到開頭。最常見的用途是向表格添加條紋,交替每一行的樣式值:

      您可以使用{% for %}標簽實現相同的結果,但這種方法需要更多代碼。

      注釋

      盡管您可以使用 以 HTML 格式編寫評論,但下載到用戶瀏覽器的響應包括這些評論。Django 包含一個{% comment %}標簽,其內容被完全剝離:

      {% comment %} Nothing to see here! {% endcomment %}

      您還可以將字符串參數包含到{% comment %}用作注釋的標簽中。這可能看起來有點奇怪,但如果您要注釋掉代碼,它會很有用。您使用塊注釋掉代碼,然后使用注釋來提醒自己注釋掉代碼的原因。

      特殊的角色

      默認情況下,Django 模板渲染器會自動轉義它渲染的任何變量。如果字符串包含 HTML 特有的字符,例如HTML 標簽中使用的尖括號 (?<,?>)?,這會嘗試防止您的 HTML 被損壞。該{% autoescape %}標簽允許您控制此行為:

      {% autoescape off %} {{ content }} {% endautoescape %}

      所述{% autoescape %}標簽取的單個參數on或off,把擒縱機構打開或關閉,分別。考慮以下模板:

       {% autoescape on %} Escaped: {{ my_text }} {% endautoescape %} {% autoescape off %} Not Escaped: {{ my_text }} {% endautoescape %} 

      如果my_text包含"Hello world",則呈現的內容將有兩個版本的字符串:

      autoescape on更改 HTML 特殊字符,使其呈現為字符串中的原樣。相比之下,使用autoescape off,粗體標記會傳遞給瀏覽器。

      Django 模板語言:標簽和過濾器

      所有使用特殊字符的語言都需要一種直接使用相同特殊字符的方法。如果要使用表示標簽的字符,可以將它們包裝在{% verbatim %}標簽中:

      {% verbatim %} Django uses mustaches braces to render variables: {{ is_scary }}. {% endverbatim %}

      許多JavaScript框架都有自己的模板語言。變量或標簽的雙括號格式很常見。如果您需要在 Django 模板中包含 JavaScript 模板,將它們包裝在{% verbatim %}標簽中將導致 Django 的模板渲染器忽略它們,將它們留在 JavaScript 中。

      日期和時間

      您經常需要在網站上顯示日期和時間信息。{% now %}Django 模板語言中的標記為您提供當前日期和時間。它需要一個字符串參數來指定要顯示的日期時間的格式。由于歷史原因,格式字符串基于 PHPdate()函數而不是 Python 的strftime.?文檔中提供了可能的格式字符列表。

      Copyright 2012-{% now "Y" %}

      網址

      Django 的視圖和路由機制有一種內置的 URL 命名方式。硬編碼 URL 是不好的做法。如果有什么變化,那么你必須追查你在代碼中使用它的所有時間。您可以使用{% url %}標記,而不是在視圖中解析 URL 并將其作為上下文傳遞:

      Home

      的參數{% url %}是任何URL 模式名稱,與 Django 的reverse()工作方式相同。它可以選擇將位置或命名參數用于所引用的基礎視圖。

      探索關鍵模板過濾器

      正如您之前學到的,Django 模板標簽是模板語言的關鍵字和函數。過濾器就像是在 Django 渲染數據之前就地修改數據的小函數。

      您可以通過|在變量后添加管道 (?) 和過濾器名稱將過濾器放在雙括號內。這是受到在 Unix shell 中如何通過管道相互傳遞命令的啟發。

      現在,您將了解一些與字符串、列表、日期和時間一起使用的常見過濾器,以及展示如何使用它們的示例。

      字符串過濾器

      過濾器可以對各種數據進行操作。它們中的許多直接對應于具有相同目的的 Python 函數。該upper過濾器是一樣的str.upper()在Python方法。使用它會將變量的內容更改為大寫。通過修改templates/listing.html將upper過濾器添加到movie.0變量中來嘗試一下:

      {% extends "base.html" %} {% block content %}

      Movies

      • #{{forloop.counter}} {{movie.0|upper}} was released in {{movie.1}}
      • ?

        通過上述更改,列表中的每個電影標題都將采用大寫字母。毫不奇怪,還有一個相應的lower過濾器。

        該center過濾器添加填充到字符串的兩側。填充是一個空格字符,因此根據您的字體和包裝它的標簽,此過濾器的效果可能有限:

        {{value}} becomes *{{ value|center:"16" }}*

        如果valuecontains?"Elephant",則此示例會在每側產生四個空格:

        Elephant becomes * Elephant *

        如果需要從字符串中刪除字符,可以使用cut過濾器。to 的參數cut是要刪除的子字符串:

        *{{value}}* becomes *{{ value|cut:" " }}*

        看看當你使用cut帶有valueof的過濾器時會發生什么"Bates Motel":

        *Bates Motel* becomes *BatesMotel*

        請注意, to 的參數cut不是要剪切的字符列表,而是要剪切的序列。如果你試圖用它來減少這個值"ae",什么都不會發生。中沒有"ae"子串"Bates Motel"。

        列出過濾器

        過濾器可以對類似列表的值進行操作。在first與last分別在迭代過濾器返回的第一項和最后一項,:

        {{ goodies|first }}

        如果goodies包含["popcorn", "peanuts", "cola"],則此示例的結果為"popcorn"。使用last過濾器會導致"cola".

        除了使用過濾器訪問列表的一部分之外,您還可以使用它們從列表中獲取數據。該join濾波器類似于Python的str.join()方法。它返回一個由列表部分組成的字符串:

        {{ goodies|join:", " }}

        您可以使用冒號 (?:) 將參數傳遞給過濾器。goodies使用逗號作為參數加入列表會返回一個包含逗號分隔列表的字符串:"popcorn, peanuts, cola"。

        要查找列表的長度,請使用length過濾器。這在與其他過濾器結合使用時特別有用。當處理多個項目時,pluralize過濾器會"s"在單詞的末尾添加一個。嘗試將以下行添加到標題templates/listing.html正下方

        Movies

        {% extends "base.html" %} {% block content %}

        Movies

        {{movies|length}} movie{{movies|length|pluralize}} found.

        ?

        Django 將第一組雙括號替換為movies列表的長度。第二組正在做一些聰明的事情:鏈接過濾器。該pluralize過濾器采用一個數字。如果數字2大于或等于,則返回一個"s"。通過使用lengthand then?pluralize,您將傳遞moviesto的長度pluralize。

        如果添加一個"s"不是您將單詞復數的方式,您會怎么做?過濾器支持指定結束后綴的參數:

        You have {{num_boxes}} box{{num_boxes|pluralize:"es"}}.

        在這個例子中,而不是追加"s",pluralize追加"es",返回"boxes"。對于具有不同詞尾的單詞,您可以同時指定單數和復數詞尾:

        You have {{num_cherries}} cherr{{num_cherries|pluralize:"y,ies"}}.

        在上面的示例中,pluralize如果結果是單數,則添加逗號前指定的字符串,如果結果是復數,則添加逗號后指定的字符串。這樣,您就可以正確獲得"cherry"或"cherries"。

        日期和時間過濾器

        日期或時間的呈現應特定于用戶的語言環境。在您的代碼中,建議您僅使用 Pythondatetime對象。您應該將此對象的格式設置留給渲染時間。有過濾器可以幫助您解決這個問題。

        該date過濾器可以接受類似的參數{% now %},你看到在本教程前面的標簽。與該標簽一樣,date過濾器的參數指定日期的表示格式:

        {{release_date|date:"Y-m-d"}}

        此示例將以release_date年-月-日ISO 8601格式顯示 的內容。對于公民凱恩來說,這將是 1941-09-05(1941 年 9 月 5 日)的廣泛發行。雖然它被稱為date過濾器,但它也支持時間,假設它正在處理一個datetime對象而不僅僅是一個date對象。

        如果您只對時間感興趣,那么還有一個過濾器。的time過濾器使用的配置參數的子集date,只是那些具有時間做。用法類似:

        {{showing_at|time:"H:i"}}

        本示例以 24 小時時鐘格式顯示顯示時間。對于晚上 9:30 的電影,Django 將其呈現為"21:30".

        一種使時間更具可讀性的流行格式是顯示自事件以來經過的時間。您會在許多網絡郵件客戶端中看到這一點,這些客戶端顯示的信息類似于“3 天前”收到了一封電子郵件。Djangotimesince過濾器為您提供了這種能力:

        {{release_date|timesince}}

        此示例顯示自電影發行日期以來經過的時間量。默認情況下,此過濾器計算從現在開始經過的時間。或者,您可以添加一個參數來timesince指定比較日期。

        有一個配套過濾器timesince叫做timeuntil.?它不是向后看日期,而是向前看。您可以使用它來顯示會議或類似事件的倒計時。

        雙方timesince并timeuntil根據服務器的時間計算差值時,Django的渲染模板。計算是使用 中的時區信息完成的settings.py。如果您的服務器不是 UTC 并且您的 Django 配置使用的是 UTC 默認值,這可能會產生奇怪的結果。確保這兩個配置匹配,否則您的時差計算將不正確。

        第三方標簽和過濾器庫

        除了內置的 Django 模板標簽和過濾器,您還可以編寫自己的.?您可以找到有用的第三方庫,其中包括自定義標簽和過濾器。一個這樣的庫是django-simple-tags.?不要將其與simple_tag()Django 中類似命名的函數混淆。

        要在模板中使用第三方庫,您需要執行三個步驟:

        安裝應用程序庫

        注冊與應用程序INSTALLED_APPS中settings.py

        在模板中加載標簽

        安裝 Django 應用程序庫與任何其他包沒有什么不同。您可以使用pip以下方法安裝它:

        $ python -m pip install django-simple-tags

        安裝軟件包后,更新文件的INSTALLED_APPS一部分settings.py以使 Django 知道該應用程序:

        33INSTALLED_APPS = [ 34 "django.contrib.admin", 35 "django.contrib.auth", 36 "django.contrib.contenttypes", 37 "django.contrib.sessions", 38 "django.contrib.messages", 39 "django.contrib.staticfiles", 40 "core", 41 "django_simple_tags", 42]

        現在 Django 知道該應用程序,但您還不能使用標簽。在使用它們之前,首先需要將它們加載到模板中。您可以使用{% load %}標簽執行此操作:

        1{% load django_simple_tags %} 2 3Current value of DEBUG is {% get_setting "DEBUG" %}

        在第 1 行,{% load %}標簽將所有標簽添加django-simple-tags到您的模板上下文中。請注意,周圍沒有引號django_simple_tags。這要與import聲明保持一致。該django-simple-tags庫有二十多個標簽和過濾器。此示例顯示從 Django 設置{% get_setting %}返回的值DEBUG。

        有許多第三方庫和大量可以簡化 HTML 的標簽。使用它們只是一個pip install和一個{% load %}標簽。

        結論

        Django 模板標簽和過濾器為您提供了一種以可重用方式構建 HTML 輸出的強大方法。模板以它們自己的語言定義,以便將業務邏輯與顯示邏輯分開。標簽就像語言的關鍵字和功能,而過濾器允許您在顯示之前修改現有數據。

        在本教程中,您學習了如何:

        使用 DjangoTemplate和Context對象編譯模板

        從文件加載模板并使用render()快捷方式返回它們

        使用條件塊和循環塊編寫模板

        使用extends和include編寫可重用的模板組件

        使用模板過濾器修改數據

        從第三方庫加載和使用自定義模板標簽和過濾器

        您可以在優秀文檔 中找到有關 Django 的更多一般信息。在同一文檔中,您還可以找到有關模板標簽和過濾器的更多具體信息。

        如果您想學習有關Real Python 的一些 Django 教程,您可以查看Django 入門第 1 部分:構建投資組合應用程序、Django 的 Web 開發學習路徑以及可用的Django 教程列表。

        MoviePalace 教程中最后一個合適的詞必須是:Rosebud。

        IoT Python

        版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

        版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:華為、釘釘、伙伴云等一同入選首屆《產業數字化金鏟獎》榜單
      下一篇:如何單擊以放大或展開Word文檔中的圖像?
      相關文章
      亚洲中文无码a∨在线观看| 亚洲经典在线中文字幕| 亚洲AV综合色区无码一区爱AV | 亚洲毛片基地日韩毛片基地| 亚洲∧v久久久无码精品| 国产亚洲婷婷香蕉久久精品| 亚洲人成色777777在线观看| 中文字幕不卡亚洲 | 亚洲七七久久精品中文国产| 国产午夜亚洲精品不卡| 亚洲av午夜电影在线观看 | 日韩精品亚洲专区在线观看| 蜜芽亚洲av无码一区二区三区| 亚洲av无码成人精品国产| 亚洲AV性色在线观看| 偷自拍亚洲视频在线观看99| 国产精品亚洲综合一区在线观看| 在线观看亚洲网站| 国产成人高清亚洲一区久久| 亚洲综合另类小说色区色噜噜| 中文字幕日韩亚洲| 亚洲熟妇无码乱子AV电影| 亚洲精品亚洲人成在线观看| 亚洲av色影在线| 亚洲福利视频一区二区三区| 亚洲av无码片区一区二区三区| 亚洲免费闲人蜜桃| 国产精品亚洲综合五月天| 亚洲夂夂婷婷色拍WW47| 亚洲AV永久无码精品网站在线观看 | 亚洲av无码一区二区三区乱子伦| 亚洲视频在线观看免费| 亚洲精品中文字幕无乱码| 亚洲中文字幕一二三四区苍井空| 亚洲乱人伦中文字幕无码| 亚洲不卡无码av中文字幕| 亚洲综合无码AV一区二区| 亚洲嫩草影院久久精品| 亚洲人成7777影视在线观看| 亚洲爆乳大丰满无码专区| 久久国产成人亚洲精品影院|