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頁面。它可以是一個文件或只是註釋一行代碼。