Django-模板

Tynam.Yang發表於2020-11-16

定義

DTL(django Tempalte language)是Django自帶的模板語言。 Django支援Jinja2等其他模板引擎。DTL模板是一種帶有特殊語法的HTML檔案,可以被Django編譯,產地引數,實現資料動態化。在編譯完成後,生成一個普通的HTML檔案,然後傳送給客戶端。

在 Django 中提供了 render ,直接將模板渲染成字串和包裝成HttpResponse物件。views 下的示例如下:

def index(request):
    return render(request,'index.html')

模板查詢順序

新新增的  app 需要在 settings 進行註冊:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book',
]

模板檔案查詢:

首先會在專案的 templates 下查詢。
其次在自己所在的 app下的 templates 中查詢。
最後在其他的 app下 查詢。
如果下面的程式碼中的 APP_DIRS 的值為 False,則不會在 app下進行查詢,只會在專案的 templates 下查詢。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

引數傳遞

在 render 中有context 引數作為引數的傳遞。
例如 views 為:

def index(request):
    context = {
        'username': 'ty'
    }
    return render(request,'index.html', context=context)

在html中使用兩個大括號{{ "變數" }} 進行引用:

<body>
    {{ username }}
</body>

如果是有層級關係,例如類中的變數,則可以使用點 class.value 進行獲取。
例如字典,也可以使用點進行獲取 dict.key 。但是如果使用 dict.keys 獲取到的是字典的所有 key。不能通過中括號[]的形式進行獲取。
例如列表,可以使用下標進行獲取 list.index 。元組也是一樣的。

常用標籤

if 標籤:也可以結合 else 一起使用,但是需要有結束表示 endif,可以使用基本運算子 == ,!=, >= 等。

{% if number < 1 %}
   <p>小於1</p>
{% if number == 1 %}
  <p>等於1</p>
{% else %}
   <p>大於1</p>
{% endif %}

for 標籤:與 Python 的 for 語句的情形類似,迴圈語法是 for X in Y ,Y 是要迭代的序列而 X 是在每一個特定的迴圈中使用的變數名稱。每一次迴圈中,模板系統會渲染在 {% for %} 和 {% endfor %} 之間的所有內容。

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

url標籤
url 後面的為 path 中的 name 值。

<a href="{ % url 'urlname' % }"></a>

也可以在 url 中新增引數:

<a href="{ % url 'urlname' id='3' % }"></a>

過濾器

在DTL中不支援函式的呼叫形式,因此不能給函式傳遞引數。而過濾器其實就是一個函式,可以對需要處理的引數進行處理,並且可以額外接收一個引數。
add: 將傳進來的引數新增到原來的值上面。

{{ value|add:'3' }}

cut: 移除字串,類似於 replace 函式。

{{ value|cut:" " }}

date:日期格式,將一個日期按照制定格式,格式化成字串。

# 資料
context = {
    ”birthday“:datetiem.now()
}

# 模板
{{ birthday|date:"Y/m/d" }}

其他時間格式化的方式。

格式字元

描述

示例

Y

四位數字的年份

2018

m

兩位數字的月份

01-12

n

月份,1-9前面沒有0字首

1-12

d

兩位數字的天

01-31

j

天,但是1-9前面沒有0字首

1-31

g

小時,12小時格式的,1-9前面沒有0字首

1-12

h

小時,12小時格式的,1-9前面有0字首

01-12

G

小時,24小時格式的,1-9前面沒有0字首

1-23

H

小時,24小時格式的,1-9前面有0字首

01-23

i

分鐘,1-9前面有0字首

00-59

s

秒,1-9前面有0字首

00-59

其他過濾器

過濾器說明
addslashes 新增斜槓
capfirst 首字母大寫
center 文字居中
default 設定預設值
default_if_none 為None設定預設值
dictsort 字典排序
dictsortreversed 字典反向排序
divisibleby 整除判斷
escape 轉義
escapejs 轉義js程式碼
filesizeformat 檔案尺寸人性化顯示
first 第一個元素
floatformat 浮點數格式化
force_escape 強制立刻轉義
get_digit 獲取數字
iriencode 轉換IRI
join 字元列表連結
last 最後一個
length 長度
length_is 長度等於
linebreaks 行轉換
linebreaksbr 行轉換
linenumbers 行號
ljust 左對齊
lower 小寫
make_list 分割成字元列表
phone2numeric 電話號碼
pluralize 複數形式
pprint 除錯
random 隨機獲取
rjust 右對齊
safe 安全確認
safeseq 列表安全確認
slice 切片
slugify 轉換成ASCII
stringformat 字串格式化
striptags 去除HTML中的標籤
time 時間格式化
timesince 從何時開始
timeuntil 到何時多久
title 所有單詞首字母大寫
truncatechars 截斷字元
truncatechars_html 截斷字元
truncatewords 截斷單詞
truncatewords_html 截斷單詞
unordered_list 無序列表
upper 大寫
urlencode 轉義url
urlize url轉成可點選的連結
urlizetrunc urlize的截斷方式
wordcount 單詞計數
wordwrap 單詞包裹
yesno 將True,False和None,對映成字串‘yes’,‘no’,‘maybe’

模板繼承

編寫一個公共 html 檔案,在子模板中繼承公共模組即可達到複用的目的。在子模組中使用 { % extends 'xxx.html' % }
在公共 html 檔案中,可以使用 block 作為一個介面,進行對公共模組區域的內容進行填充。填充後會覆蓋公共模組 block 中內容。

# 公共模組,block後面為block名稱
    {% block blockname %}
    
    {% endblock %}

# 子模組

    { % extends 'xxx.html' % }
    {% block blockname %}
    
    {% endblock %}

如果公共模組中 block 中有部分內容不希望被覆蓋,則可新增 block.super 進行標識。

# 公共模組,block後面為block名稱
    {% block blockname %}
        {{ block.super }}
    這是不會被覆蓋的程式碼
    {% endblock %}

載入靜態檔案

1、確保 django.contrib.staticfiles 已經新增到settings中的INSTALLED_APPS
2、確保settings中設定了 STATIC_URL = '/static/'
3、在已經安裝了的 app 下建立一個資料夾叫 static
4、如果一些靜態檔案是不和任何app掛鉤的,可以在 settings 中新增 STATICFILES_DIRS

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")
]

5、在模板中使用 load 標籤載入 static 標籤。

    {% load static %}
    <link rel="stylesheet" href="{ % static 'style.css' % }">

6、如果不想每次在模板中載入靜態檔案使用 load 載入 static 標籤,那麼可以在 settings 中的 TEMPLATES/OPTIONS 中新增內建標籤,builtins

'builtins':['django.templatetags.static']

7、如果沒有在 settings 下的 INSTALLED_APPS 中新增 django.contrib.staticfiles ,那麼需要手動將請求靜態檔案的 url 與靜態檔案的路徑進行對映。