django模板語法和模組層
阿新 • • 發佈:2022-05-16
django模板語法和模組層
模板語法之過濾器
# 過濾器(類似於內建函式)
過濾器從字面的意思上,可以理解為:過濾掉不需要的,剩下我們需要的
# 語法結構
{{ 資料物件|過濾器名稱:引數 }} 過濾器最多隻能額外傳輸一個引數
常見的過濾器
過濾器 | 過濾器說明 |
---|---|
length | 獲取資料的長度 |
add:'n' | 算術加法或者字串加法 |
file_size,filesizeformat | 將數字轉成合適的檔案計量單位 |
default | 判斷當前資料物件對應的布林值 |
date:'Y-m-d' | 時間格式化 |
slice:'0:8' | 索引切片 |
truncatewords:5 | 按照空格擷取指定個數的文字 |
cut:' ' | '移除指定的字元 |
safe | 預設不對變數內的字串進行html轉義 |
<p>統計資料的長度:{{ s1|length }}</p> <p>算術加法或者字串加法:{{ n1|add:111}}、{{ s1|add:'big baby' }}</p> <p>將數字轉成合適的檔案計量單位:{{ file_size|filesizeformat }}、{{ file_size1|filesizeformat }}</p> <p>時間格式化:{{ ctime|date:'Y-m-d' }}</p> <p>索引切片:{{ s1|slice:'0:8' }}</p> <p>按照空格擷取指定個數的文字:{{ s2|truncatewords:5 }}</p> <p>按照字元個數擷取文字(包含三個點):{{ s2|truncatechars:5 }}、{{ s1|truncatechars:10 }}</p> <p>移除指定的字元:{{ info|cut:'|' }}</p> <p>是否取消轉換:{{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}</p>
模板語法之標籤
# 標籤 使用Django中的標籤可以在模板中做一些簡單的邏輯判斷。 標籤和{% %}配合使用 # 語法結構 {% 名字 ...%} {% end名字 %} # if 判斷 {% if 條件1 %} <p>內容1</p> {% elif 條件2 %} <p>內容2</p> {% else %} <p>內容3</p> {% endif %} # for迴圈 提供了forloop關鍵字 {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False} 正常的for迴圈輸出 {% for i in l1 %} <p>{{ i }}</p> {% endfor %} # for+if 巢狀使用 {% for i in l1 %} {% if forloop.first %} <p>這是第一次迴圈</p> {% elif forloop.last %} <p>這是最後一次迴圈</p> {% else %} <p>中間迴圈</p> {% endif %} {% empty %} <p>for迴圈物件為空 自動執行</p> {% endfor %} # 字典的用法 '提供了keys、values、items方法' user{name:'jason',age:18} {% for foo in user %} {{ foo }} # name age {{ endfor }} {% for foo in user.keys %} {{ foo }} # name age {{ endfor }} {% for foo in user.values %} {{ foo }} # jason 18 {{ endfor }} {% for foo in user.items %} {{ foo }} # ('name','jason')('age',18) {{ endfor }}
自定義過濾器、標籤、inclusion_tag
# 自定義過濾器、標籤、inclusion_tag 的步驟
1.在應用下需要建立一個名為templatetags的資料夾
2.在該資料夾內建立一個任意名稱的py檔案
3.在該py檔案內需要先提前編寫兩行固定的程式碼
from django import template
register = template.Library()
自定義過濾器
# 自定義過濾器:只能接收兩個引數
@register.filter(is_safe=True) # 括號內name可以對過濾器命名呼叫
def index(a, b):
return a + b
{% load mytag %} # 載入自定義過濾器
{{ n1|index:333 }} # 使用自定義過濾器
自定義標籤
# 自定義簡單標籤:可以接收任意的引數
@register.simple_tag(name='my_tag')
def func1(a, b, c, d):
return a + b + c + d
{% my_tag 1 2 3 4 %} # 引數之間空格隔開即可
自定義inclusion_tag
# 自定義inclusion_tag
@register.inclusion_tag('left.html')
def func2(n):
l1 = []
for i in range(1, n + 1):
l1.append(f'第{i}頁')
return locals()
{% func2 10 %}
# left.html
<ul>
{% for foo in l1 %}
<li>{{ foo }}</li>
{% endfor %}
</ul>
'''
該方法需要先作用於一個區域性html頁面 之後將渲染的結果放到呼叫的位置
'''
模組的匯入
# 模組的匯入
將頁面的某一個區域性當成模組的形式
哪個地方需要就可以直接匯入使用即可
# 模板匯入格式
{% include '匯入html檔名' %}
# 註釋語法補充
<!----> 是HTML的註釋語法
{##} 是django模板語法的註釋
"""
HTML的註釋可以在前端瀏覽器頁面上直接檢視到
模板語法的註釋只能在後端檢視 前端瀏覽器檢視不了
"""
模組的繼承
# 繼承的概念
你需要事先在你想要使用的主頁面上劃定區域做好標記,之後在子頁面繼承的時候你就可以使用在主頁面劃定的區域,也就意味著,如果你不劃定任何區域,那麼你子頁面將無法修改主頁面內容
'有很多網站的很多頁面 其實都是差不多的 只是區域性有所變化 模板的繼承可以很好的實現該需求'
# 使用繼承流程原理
1.先在模板中通過block劃定將來可以被修改的區域
{% block content %}
<h1>主頁內容</h1>
{% endblock %}
2.子板繼承模板 利用block自動提示選取你想要修改的內容區域標記名稱
{% extends 'home.html' %}
3.修改劃定的區域
{% block content %}
<h1>登入內容</h1>
{% endblock %}
4.子頁面還可以重複使用父頁面的內容
{{ block.super }}
"""
模板上最少應該有三個區域
css區域、內容區域、js區域
子頁面就可以有自己獨立的css、js、內容
"""
模板繼承語法
1.繼承
{% extends '模版頁面名' %}
2.區域性修改
# 1.你需要先去模版頁面中劃定可以被修改的區域
{% block '名字' %}
模版內容(666)
{% endblock %}
# 2.子頁面中即成了模版頁面之後 就可以根據名字修改
{% block '名字' %}
子版內容
# 子版頁面除了可以自己寫自己的之外 還可以繼續使用模版的內容
{{ block.super }}
{% endblock %}
前期資料準備
"""
django自帶的sqlite3資料庫 功能很少 並且針對日期型別不精確
1.資料庫正向遷移命令(將類操作對映到表中)
python3 manage.py makemigrations
python3 manage.py migrate
2.資料庫反向遷移命令(將表對映成類)
python3 manage.py inspectdb
"""
需求
我們只想操作orm 不想使用網路請求
需要有專門的測試環境
1.自己搭建
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
import django
django.setup()
2.pycharm提供
python console