今日學習內容總結5.2
阿新 • • 發佈:2022-05-16
今日學習內容總結
模板語法
模板語法之過濾器
過濾器說明
1. 類似於Python的內建方法
2. 將豎槓左側的資料當做第一個引數傳給右邊的過濾器
3. 語法 : {{ [資料]|過濾器:可選引數 }}
4. 注意 : 豎槓左右兩邊沒有空格
5. 過濾器引數包含空格的話需要使用引號包裹
6. 過濾器最多隻能有兩個引數
語法結構
{{ 資料物件|過濾器名稱:引數 }} 過濾器最多隻能額外傳輸一個引數
常用過濾器使用
django模板語法提供了60+過濾器,我們瞭解常用過濾器就可以了。
<p>統計資料的長度:{{ s1|length }}</p> <p>算術加法或者字串加法:{{ n1|add:111 }}、{{ s1|add:'big baby' }}</p> <p>將數字轉成合適的檔案計量單位:{{ file_size|filesizeformat }}、{{ file_size1|filesizeformat }}</p> <p>判斷當前資料物件對應的布林值是否是False:{{ b|default:'前面的值對應的布林值是False' }}、{{ s1|default:'前面的值對應的布林值是False' }}</p> <p>時間格式化:{{ ctime|date:'Y-m-d' }}</p> <p>索引切片:{{ s1|slice:'0:8' }}</p> <p>按照空格擷取指定個數的文字:{{ s2|truncatewords:5 }}、{{ s1|truncatewords:1 }}</p> <p>按照字元個數擷取文字(包含三個點):{{ s2|truncatechars:5 }}、{{ s1|truncatechars:10 }}</p> <p>移除指定的字元:{{ info|cut:'|' }}</p> <p>是否取消轉換:{{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}</p>
最後一個|safe啟發了我們以後用django開發全棧專案前端頁面程式碼(主要指HTML程式碼)也可以在後端編寫:
from django.utils.safestring import mark_safe
html_safe = mark_safe('<h1>你好</h1>')
模板語法之標籤
在django模板語法中寫標籤的時候,可以只寫關鍵字然後tab鍵就會自動補全。
語法結構
{% 名字 ...%}
{% end名字 %}
if判斷
{% if 條件1 %} <p>你好啊</p> {% elif 條件2 %} <p>他好呀</p> {% else %} <p>大家好</p> {% endif %}
for迴圈
提供了forloop關鍵字
{% for i in l %} <p>{{ forloop }}</p> <p>{{ i }}</p> # 迴圈從列表 l 中取出一個個元素 {% endfor %} # forloop 輸出的是 {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False} counter0 索引 counter 第一個元素 revcounter 倒序第一個元素 revcounter0 倒序索引 first 是否是第一個元素 last 是否是最後一個元素
for與if混合使用
{% for i in l %}
{% if forloop.first %}
<p>is first</p>
{% elif forloop.last %}
<p>is last</p>
{% else %}
<p>{{ i }}</p>
{% endif %}
{% endfor %}
with : 取別名
{% with ll.2.hobby.0 as hb %}
<p>{{ hb }}</p> # 可以使用別名取值
<p>{{ ll.2.hobby.0 }}</p> # 也可以使用原來的方式取值
{% endwith %}
字典values、keys、items方法
{% for k in d.keys %}
<p>{{ k }}</p>
{% endfor %}
{% for v in d.values %}
<p>{{ v }}</p>
{% endfor %}
{% for kv in d.items %}
<p>{{ kv }}</p>
{% endfor %}
自定義過濾器、標籤、inclusion_tag
建立 templatetags 檔案
1. 首先在應用下建立一個名字必須叫"templatetags"資料夾
2. 在改資料夾下建立一個任意名稱的 py 檔案 (例 : mytag)
3. 在該 py 檔案內固定書寫兩行程式碼
from django import template
register = template.Library()
自定義過濾器
自定義過濾器最多隻能有兩個形參。
from .templatetags.mytag import register
# 在模板層匯入自定義的過濾器時使用的是這裡指定的名字
@register.filter(name='myfilter')
def sums(a, b): # 函式名隨便起什麼
return a + b # 返回兩個引數的和
{% load mytag %} # 匯入tag檔案
<p>{{ i|myfilter:100 }}</p> # 使用myfilter過濾器
自定義標籤
自定義標籤可以接收任意的引數。
from .templatetags.mytag import register
# 在模板層匯入自定義的標籤時使用的是這裡指定的名字
@register.simple_tag(name="my_tag")
def my_join(a,b,c,d): # 函式名任意
return f'{a}/{b}/{c}/{d}' # 返回引數拼接後的結果
{% load mytag %} # 匯入tag檔案
<p>{% my_tag 'hello' 'pai' 'da' 'xing' %}</p> # 標籤之後的多個引數彼此之間用空格隔開
# 自定義inclusion_tag
from .templatetags.mytag import register
@register.inclusion_tag('test.html',name='my_incl_tag') # 第一個引數是需要渲染的HTML頁面
def func(n):
data=[]
for i in range(n):
data.append(f'第{i}頁')
return locals()
# test.html 檔案
{% load mytag %}
<p>{% my_incl_tag 6 %}</p>
# test2.html
{{ data }}
{% for foo in data %}
{% if forloop.first %}
<p>{{foo}}</p>
{% elif forloop.last %}
<p>{{ foo }}</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% endfor %}
該方法需要先作用於一個區域性html頁面,之後將渲染的結果放到呼叫的位置。內部原理:
1. 在HTML頁面中匯入寫好的 inclusion_tag 並呼叫了
2. 觸發了py檔案中一個函式的執行併產生結果
3. 產生的結果通過模板語法傳遞給一個HTML頁面進行渲染
4. 渲染完畢後又返回呼叫 inclusion_tag 的位置
test.html 頁面中呼叫了 inclusion_tag----->觸發執行了一個函式產生結果並渲染到 test2.html 頁面中, 渲染完又返回 test.html 頁面。
模板
模板的匯入
類似於將html頁面上的區域性頁面做成模組的形式 ,哪個地方想要直接匯入即可展示。
{% include 'edit.html' %} # 直接在當前HTML檔案裡面顯示 edit.html 檔案的內容
<!----> 是HTML的註釋語法
{##} 是django模板語法的註釋
HTML的註釋可以在前端瀏覽器頁面上直接檢視到
模板語法的註釋只能在後端檢視 前端瀏覽器檢視不了
模板的繼承
模板繼承的使用
模板的繼承首先需要選擇一個模板頁面, 在該頁面裡面使用 block 劃定可以被更改的區域:
# 母板頁面 'home.html' 檔案
{% block [區域名稱] %}
......
{% endblock %}
想要繼承的頁面可以使用 extends 來繼承某一個頁面。
# 子版
{% extends 'home.html' %}
{% block [區域名稱] %}
......
{% endblock %}
子版繼承了模板, 那麼子版的整體格式與模板一樣, 被 block 劃分了的區域可以自己隨意更改。
子頁面還可以重複使用父頁面的內容。
{{ block.super }}
模板的三個區域
模板上最少應該有三個區域:
{% block css %}
# css區域
{% endblock %}
{% block content %}
# HTML區域
{% endblock %}
{% block js %}
# js區域
{% endblock %}
目的是為了讓子版具有獨立的css、js等,增加擴充套件性。