Django - 模板系統



Django 允許分離 Python 和 HTML 程式碼,Python 程式碼位於檢視中,HTML 程式碼位於模板中。為了連線兩者,Django 依賴於 render 函式和 Django 模板語言。

Render 函式

此函式接受三個引數:

  • 請求 - 初始請求。

  • 模板路徑 - 這是相對於專案 settings.py 檔案中 TEMPLATE_DIRS 選項的相對路徑。

  • 引數字典 - 包含模板中所需所有變數的字典。您可以建立此變數,也可以使用 locals() 傳遞在檢視中宣告的所有區域性變數。

Django 模板語言 (DTL)

Django 的模板引擎提供了一種小型語言來定義應用程式的使用者介面層。

顯示變數

變數形式如下:{{variable}}。模板會將變數替換為檢視在 render 函式的第三個引數中傳送的變數。讓我們修改 hello.html 來顯示今天的日期:

hello.html

<html>
   
   <body>
      Hello World!!!<p>Today is {{today}}</p>
   </body>
   
</html>

然後我們的檢視將更改為:

def hello(request):
   today = datetime.datetime.now().date()
   return render(request, "hello.html", {"today" : today})

訪問 URL /myapp/hello 後,我們將獲得以下輸出:

Hello World!!!
Today is Sept. 11, 2015

您可能已經注意到,如果變數不是字串,Django 將使用 __str__ 方法來顯示它;同樣,您可以像在 Python 中一樣訪問物件屬性。例如:如果要顯示日期年份,我的變數將是:{{today.year}}。

過濾器

它們幫助您在顯示時修改變數。過濾器的結構如下:{{var|filters}}。

一些例子

  • {{string|truncatewords:80}} - 此過濾器將截斷字串,您將只看到前 80 個單詞。

  • {{string|lower}} - 將字串轉換為小寫。

  • {{string|escape|linebreaks}} - 跳脫字元串內容,然後將換行符轉換為標籤。

您還可以為變數設定預設值。

標籤

標籤允許您執行以下操作:if 條件語句,for 迴圈,模板繼承等等。

if 標籤

就像在 Python 中一樣,您可以在模板中使用 if、else 和 elif:

<html>
   <body>
   
      Hello World!!!<p>Today is {{today}}</p>
      We are
      {% if today.day == 1 %}
      
      the first day of month.
      {% elif today.day == 30 %}
      
      the last day of month.
      {% else %}
      
      I don't know.
      {%endif%}
      
   </body>
</html>

在這個新的模板中,根據一天中的日期,模板將呈現某個值。

for 標籤

就像 'if' 一樣,我們有 'for' 標籤,它的工作方式與 Python 中完全相同。讓我們更改 hello 檢視以將列表傳輸到我們的模板:

def hello(request):
   today = datetime.datetime.now().date()
   
   daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
   return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})

使用 {{ for }} 顯示該列表的模板:

<html>
   <body>
      
      Hello World!!!<p>Today is {{today}}</p>
      We are
      {% if today.day == 1 %}
      
      the first day of month.
      {% elif today.day == 30 %}
      
      the last day of month.
      {% else %}
      
      I don't know.
      {%endif%}
      
      <p>
         {% for day in days_of_week %}
         {{day}}
      </p>
		
      {% endfor %}
      
   </body>
</html>

我們應該得到類似這樣的結果:

Hello World!!!
Today is Sept. 11, 2015
We are I don't know.
Mon
Tue
Wed
Thu
Fri
Sat
Sun

block 和 extend 標籤

如果沒有模板繼承,模板系統將是不完整的。這意味著當您設計模板時,您應該有一個帶有“空洞”的主模板,子模板將根據自己的需要填充這些“空洞”,例如,頁面可能需要為選定的選項卡使用特殊的 CSS。

讓我們更改 hello.html 模板以繼承自 main_template.html。

main_template.html

<html>
   <head>
      
      <title>
         {% block title %}Page Title{% endblock %}
      </title>
      
   </head>
	
   <body>
   
      {% block content %}
         Body content
      {% endblock %}
      
   </body>
</html>

hello.html

{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today.day == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}

在上面的例子中,呼叫 /myapp/hello 我們仍然會得到與之前相同的結果,但現在我們依賴於 extends 和 block 來重構我們的程式碼:

在 main_template.html 中,我們使用 block 標籤定義塊。title 塊將包含頁面標題,content 塊將包含頁面主要內容。在 home.html 中,我們使用 extends 繼承自 main_template.html,然後我們填充上面定義的塊(content 和 title)。

註釋標籤

註釋標籤有助於在模板中定義註釋,而不是 HTML 註釋,它們不會出現在 HTML 頁面中。這對於文件編寫或只是註釋程式碼行很有用。

廣告