Django 模板系統(tǒng)

 Django能夠單獨分開 Python 和 HTML,Python代碼/變量進入視圖和HTML模板。 連接這兩個,Django依賴于渲染函數(shù)和Django模板語言。

渲染函數(shù)

這個函數(shù)有三個參數(shù) ?

請求? 初始化請求模板路徑 ? 這是相對于在項目 settings.py 文件的變量到 TEMPLATE_DIRS 選項的路徑。參數(shù)字典 ? 字典包含所需的模板中的所有變量。這個變量可以創(chuàng)建或者可以使用 locals() 通過在視圖中聲明的所有局部變量。

Django模板語言(DTL)

Django模板引擎提供了一個小型的語言來定義應用程序面向用戶的層。

顯示變量

變量顯示如下:{{variable}}. 模板由視圖在渲染(render)函數(shù)的第三個參數(shù)發(fā)送的變量來替換變量。讓我們改變 hello.html 顯示當天的日期 :

hello.html

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
<html> 
    <body>
       Hello World!!!<p>Today is {{today}}</p>
    </body> 
 </html>

然后,我們的視圖將改變?yōu)?-

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
def hello(request):
    today = datetime.datetime.now().date()
    return render(request, "hello.html", {"today" : today})

現(xiàn)在,我們將得到下面的輸出在訪問URL /myapp/hello 之后?

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
Hello World!!!
 Today is Sept. 11, 2015

正如你可能已經(jīng)注意到,如果變量不是一個字符串,Django會使用__str__方法來顯示它;并以同樣的原則,你可以訪問對象的屬性,就像在Python中使用的一樣。例如:如果我們想顯示日期的年份,這里的變量是: {{today.year}}.

過濾器

它們可以幫助您顯示修改的變量。過濾器的結(jié)構(gòu)如下所示: {{var|filters}}.

一個簡單的實例 ?

{{string|truncatewords:80}} ? 過濾器將截斷字符串,所以只看到前80個字符。

       {{string|lower}} ? 轉(zhuǎn)換字符為小寫            {{string|escape|linebreaks}} ? 轉(zhuǎn)義字符串內(nèi)容,然后換行轉(zhuǎn)換為標簽。    

還可以設(shè)置默認的變量。

標簽

標簽可以執(zhí)行以下操作:if 條件,for循環(huán),模板繼承以及更多。

if標簽

就像在Python中,你可以使用if,else和elif在模板中 ?

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
<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>

在這個新的模板,根據(jù)當天的日期,該模板將呈現(xiàn)這個值。

for標簽

就像'if',我們有 'for' 標簽,這些完全像在Python中一樣使用它們。讓我們改變 hello視圖列表發(fā)送到我們的模板 ?

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
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 }} ?

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
<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>

我們應該得到輸出的內(nèi)容如下 ?

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
Hello World!!!
 Today is Sept. 11, 2015
 We are I don't know.
 Mon
 Tue
 Wed
 Thu
 Fri
 Sat
 Sun

塊和擴展標簽

模板系統(tǒng)是不完整模板繼承。當您設(shè)計模板的含義,子模板會根據(jù)自己的需要填寫一個主模板,就像一個頁面中所選選項卡可能需要一個特殊的CSS。

讓我們修改 hello.html 模板來從 main_template.html 繼承。

main_template.html

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
<html>
    <head> 
       <title>
          {% block title %}Page Title{% endblock %}
       </title> 
    </head>
 
    <body> 
       {% block content %}
          Body content
       {% endblock %} 
    </body>
 </html>

hello.html

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
{% 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 %}

在上面的示例, 在調(diào)用 /myapp/hello,我們?nèi)匀粫玫较嗤慕Y(jié)果和以前一樣,但現(xiàn)在我們靠的是擴展,并不用重構(gòu)代碼-?

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

注釋標簽

注釋標簽用來模板定義注釋,不是HTML注釋,它們將不會出現(xiàn)在HTML頁面。它可以是一個文件或只是注釋一行代碼。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清