Django範本系統

Django能夠單獨分開 Python 和 HTML,Python代碼/變數進入視圖和HTML範本。 連接這兩個,Django依賴於渲染函數和Django範本語言。

渲染函數

這個函數有三個參數 −

  • 請求− 初始化請求

  • 範本路徑 − 這是相對於在專案 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 == 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 == 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

塊和擴展標籤

範本系統是不完整範本繼承。當您設計範本的含義,子範本會根據自己的需要填寫一個主範本,就像一個頁面中所選選項卡可能需要一個特殊的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 == 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,我們仍然會得到相同的結果和以前一樣,但現在我們靠的是擴展,並不用重構代碼-−

在 main_template.html 我們定義使用標籤塊。標題欄塊將包含頁面標題,以及內容塊將在頁面主內容。在Home.html中使用擴展繼承來自main_template.html,那麼我們使用上面塊定義(內容和標題)。

注釋標籤

注釋標籤用來範本定義注釋,不是HTML注釋,它們將不會出現在HTML頁面。它可以是一個檔或只是注釋一行代碼。


上一篇: Django URL映射 下一篇: Django模型