自定義過濾器和自定義標籤
自定義標籤和過濾器 需要執行的3個步驟:
1. 在app中建立templatetags模組(必須的)
2. 建立任意 .py 檔案,如:my_tags.py
3. 建立任意 .py檔案, 例如:my_tags.py
自定義過濾器
舉例: 增加一個乘法過濾器
修改settings.py中的INSTALLED_APPS, 最後一行添加當前的app
django開頭的,都是一些自帶的app。它內建在django原始碼裡面
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', ]
在app01目錄裡面新建一個templatetags目錄,目錄名必須是這個!!!否則django找不到
目錄裡面建立my_filter_tag.py, 這個py檔名,可以隨便起
from django import template from django.utils.safestring importmark_safe
#因為django遇到html或者js標籤,會轉義。它認為是不安全的,所以需要在過濾器中匯入make_safe模組 register = template.Library() #register的名字是固定的,不可改變 @register.filter #自定義過濾器 def multi_filter(v1,v2): return v1 * v2
注意:頭部的3行,是固定寫法,不能改變。
增加 @register.filter 是為了將函式轉換成過濾器. 函式的名字可以隨便起
修改 views.py 裡面的index函式, 內容如下
def index(request): num = 100 return render(request,'index.html',{'num':num})
修改index.html 的body部分
注意:在使用自定義標籤和過濾器,必須在html檔案中,匯入之前建立的my_filter_tag
{% load my_filter_tag %}
<p>{{ num|multi_filter:5 }}</p>
load表示匯入模組.
p標籤中的內容是執行了multi_filter過濾器
注意:接收了2個引數, 一個是num, 一個是5. 因為 multi_filter 傳入了2個形參,必須傳入2個引數才可以.
django專案啟動時,會匯入settings.py定義的模組匯入,由於app01的自定義模組是啟動之後加的,所以要重新啟動django專案. 得到的結果是500
自定義過濾器就是一個帶有一個或兩個引數的Python函式:
注意:這個Python函式的第一個引數是你要過濾的物件,第二個引數才是你自定義的引數。而且最多總共只能有兩個引數,所以你只能自定義一個引數!這是過濾器的先天限制。
- 變數的值:不一定是字串形式。
- 引數的值:可以有一個初始值,或者完全不要這個引數。
例如,在{{ var|foo:"bar" }}
中,foo過濾器應當傳入變數var和引數"bar"。
過濾器中的語法: {{ value|filter_name:引數 }} # 引數最多隻有一個
如果要完成3位數的乘法,過濾器可以增加一個形參,但是index.html中怎麼辦呢?
只能在後端,將引數形式修改成列表,元組,字典等形式.
例如計算 4*5*6
修改index檢視函式
def index(request): num1 = 4 num2 = 5 num3 = 6 num_list = [num1,num2,num3] return render(request,'index.html',{'num_list':num_list})
修改my_filter_tag.py中的過濾器
@register.filter def multi_filter(num_list): res = 1 for i in num_list: res*=i return res
修改index.html,修改body部分
{% load my_filter_tag %}
<p>{{ num_list|multi_filter }}</p>
舉例: 顯示a標籤
修改my_filter_tag.py檔案,增加link_tag過濾器
@register.filter def link_tag(href): return mark_safe("<a href=%s>click</a>" % href
#使用make_safe方法,告訴django是安全的,不需要轉義
修改index檢視
def index(request): link = "http://www.py3study.com/" return render(request,'index.html',{'link':link})
修改index.html
{% load my_filter_tag %}
<p>{{ link|link_tag }}</p>
自定義標籤
標籤, 是為了做一些功能
舉例: 4個引數的乘法運算
修改my_filter_tag.py, 增加multi_tag函式
@register.simple_tag def multi_tag(x,y,z): return x*y*z
@register.simple_tag表示將函式轉換為自定義標籤
修改index.html,修改body部分
注意:呼叫標籤,使用{% 標籤過濾器名 引數1,引數2,引數3... %}
引數不限,但不能放在if for語句中
{% load my_filter_tag %}
<p>{% multi_tag 4 5 6 %}</p>
重新啟動django專案, 檢視結果
自定義標籤和自定義過濾器的區別:
1. 標籤,是為了做一些功能。過濾器,是對斜槓前面的資料做過濾。
2. 標籤可以寫任意個形參,而過濾器最大隻能寫2個形參。如果過濾器需要接收多個引數,需要將引數存放在列表,元組,字典等資料中。
3. 過濾器可以用在if等語句後,標籤不可以