Django 模板語法的傳值 過濾器與標籤,自定義過濾器與標籤
阿新 • • 發佈:2022-03-08
模板語法傳值
# 基本語法傳值研究:
# 模板語法的格式:
{{ }} :跟變數相關的時候使用
{% %} :跟邏輯相關的時候使用
# 研究函式:
def func():
print('無參函式')
return '無參函式返回值'
def func1(xx):
print('有參函式')
return '有參函式返回值'
# 特點:傳遞函式名會自動加括號呼叫,但是模板語法不支援給函式傳額外的引數
# 研究類: class Myclass(): def get_self(self): return 'self' @staticmethod # 轉換為普通函式 def get_func(): return 'func' @classmethod # 繫結給類的方法 def get_class(cls): return 'cls' # 物件被展示到html頁面上,也相當於執行了列印操作也會觸發__str__方法a def __str__(self): return '是否載入呢' obj = Myclass() # 類名加括號例項化產生一個物件
# 驗證:模板語法的取值方式
# django模版語法的取值 是固定的格式 只能採用“句點符” .
# 即可以點鍵也可以點索引 還可以兩者混用
模板語法之常用過濾器
# 過濾器就類似於模板語法內建的內建方法
# 基本語法:
{{資料|過濾器:引數}}
# 將資料交給過濾器去做處理,資料相當於過濾器的第一個引數,:冒號後編寫的相當於第二個引數。
1.統計長度 :{{ x|length }} # 統計長度 2.預設值 :{{ x|default:'預設值' }} # x有值(True)就用前面x,x沒有值就用:後面的'預設值' 3.檔案大小 :{{ x|filesizeformat }} # 轉換為有檔案大小單位(kb/mb/gb)的資料 4.日期格式化:{{ x|date:'Y-m-d H:i:s'}} # 轉換為年月日時分秒(utc時間) 5.切片操作 :{{ x|silce:'0:4:2' }} # 切取x從索引0到索引4步長為2 6.切取字元 :{{ x|truncatechars:9 }} # 切取到一個字符集的第9各位置並新增三個點(三個點也佔位) 7.切取單詞 :{{ x|truncatewords:9 }} # 只會按照空格切取9個單詞並新增三個點(三個點不佔位) 8.移除指定字元 :{{ x|cut:' ' }} # 取出x中的空格 9.拼接操作 :{{ x|join:'*' }} # 使字元以*進行拼接 10.加法運算 : {{ x|add:10 }} # 給數字x加10 同樣支援字串拼接 : {{ x|add:n }} # x和n兩個字串拼接 (如過不是兩個相同型別的相加 就為空'') 11.轉為前端可識別 :{{ x|safe }} # 按照html格式轉換 # 補充:後端轉義 from django.utils.safestring import mark_safe xx = make_safe('<h1>我是h1標籤</h1>') ''' 以後我們在寫全棧專案的時候,前端程式碼不一定非要在簽到頁面編寫 完全可以現在後端寫好,然後傳遞給前端頁面 '''
習題:
# 後端: def index(request): # 模板語法可以傳遞的後端python資料型別 i = 123 file_size = 21381293 s = '我是字串' n = '你好呀' b = False l = ['喜喜','哈哈','呵呵','嘿嘿'] word = 'hey boy 你好 帥哥 what is your name' title = '俄烏衝突新進展|俄軍進入烏克蘭多州 烏總統宣佈與俄羅斯斷交' h1 = '<h1>我是標籤h1</h1>' h2 = '<h2>我是標籤h2</h2>' from django.utils.safestring import mark_safe xx = mark_safe(h1) import datetime current_time = datetime.datetime.now() render(request,'index.html',locals())
# 前端:
<p>統計長度:{{ s|length }}</p>
<p>預設值:{{ b|default:'我是預設值' }}</p>
<p>檔案大小:{{ file_size|filesizeformat }}</p>
<p>日期格式化:{{ current_time|date:'Y-m-d H:i:s' }}</p>
<p>切片操作:{{ l|slice:'0:4:2' }}</p>
<p>切取字元:{{ title|truncatechars:9 }}</p>
<p>切取單詞:{{ word|truncatewords:4 }}</p>
<p>移除指定字元:{{ word|cut:' ' }}</p>
<p>拼接操作:{{ l|join:'$' }}</p>
<p>加法運算:{{ i|add:10 }}</p>
<p>字串拼接:{{ s|add:n }}</p>
<p>取消轉義:{{ h1|safe }}</p>
<p>{{ h1 }}</p>
模板語法之標籤
for迴圈
語法結構:
{% for 變數名 in 待迴圈集 %}
迴圈體程式碼
{% endfor %}
# 可直接輸入for按Tab鍵補全for迴圈的語法結構
eg:
{% for foo in l %}
{{ foo }}
{% endfor %}
關鍵字:forloop
# forloop關鍵字可標識資料的狀態
first:標識for迴圈是第一次
last :標識for迴圈時最後一次
counter0 : 索引
counter : 計數
revcounter :倒序計數
revcounter0:倒序索引
if判斷
語法結構:
{% if b %} # 判斷b是否為True
<p>if</p> # 條件成立執行
{% elif s %} # 上述條件為False判斷elif條件
<h1>elif</h1> # elif條件成立執行
{% else %} # 上述都為False
<p>else</p>
{% endif %} # 結束語法
# 可直接輸入if按Tab鍵補全語法結構
for與if混合使用:
{% for foo in lll %}
{% if forloop.first %}
<p>這是我的第一次</p>
{% elif forloop.last %}
<p>這是最後一次啊</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% empty %}
<p>for迴圈的可迭代物件內部沒有元素 根本沒法迴圈</p>
{% endfor %}
處理字典的其他方法:
# 處理字典其他方法
{% for foo in d.keys %} # keys
<p>{{ foo }}</p>
{% endfor %}
{% for foo in d.values %} # values
<p>{{ foo }}</p>
{% endfor %}
{% for foo in d.items %} # items
<p>{{ foo }}</p>
{% endfor %}
with起別名:
{% with dd.hobby.2.info as nb %}
<p>{{ nb }}</p>
# 在with語法內就可以通過as後面的別名快速的使用到前面非常複雜獲取資料的方式
<p>{{ dd.hobby.2.info }}</p> # 也可以使用之前的
{% endwith %}
自定義過濾器、標籤、inclusion_tag
自定義之前注意事項:
1. 在應用下建立一個名字'必須'為templatetags資料夾
2. 在該資料夾內建立'任意'名稱的py檔案 比如:mytag.py
3. 在該py檔案內'必須'編寫下面兩句話
from django import template
register = templante.Library()
# 注:變數名也不能改變
自定義過濾器:
# 關鍵字:@register.filter(name='自定義名字')
eg:
# 自定義過濾器:
from django import template
register = template.Library()
@register.filter(name='mysum')
def my_sum(v1,v2):
return v1+v2
# 使用
{% load mytag %} # 匯入檔案
<p>{{ n|mysum:s }}</p> # 字串拼接
<p>{{ i|mysum:222 }}</p> # 數字相加
自定義標籤
# 自定義標籤
@register.simple_tag(name='plus')
def index(a,b,c,d):
return '%s-%s-%s-%s'%(a,b,c,d)
# 具體使用
{% load mytag %}
<p>{% plus 'gary' 28 'age' 20 %}</p>
自定義inclusion_tag
# 內部原理
先定義一個方法
在頁面上呼叫該方法 並且可以傳值
該方法會生成一些資料然後傳遞給一個html頁面
之後將渲染好的結果放到呼叫的位置
# 自定義inclusion_tag
@register.inclusion_tag('left_menu.html')
def left(n):
data = ['標籤{}'.format(i) for i in range(n)] # 列表生成式
# 將data傳遞給'left_menu.html'
# 第一種方式:
# return {'data':data}
# 第二種方式:
return locals()
# left_menu.html
<ul>
{% for foo in data %} # for迴圈data列表
<li>{{ foo }}</li> # 新增到li標籤內
{% endfor %}
</ul>
# 使用
{% load mytag %} # 匯入檔案
{% left 10 %} # 引數可指定li標籤的個數