1. 程式人生 > 其它 >Django 模板語法的傳值 過濾器與標籤,自定義過濾器與標籤

Django 模板語法的傳值 過濾器與標籤,自定義過濾器與標籤

模板語法傳值

# 基本語法傳值研究:
# 模板語法的格式:
    {{ }} :跟變數相關的時候使用
    {% %} :跟邏輯相關的時候使用
# 研究函式:
    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標籤的個數