Django學習筆記之自定義過濾器及標籤
阿新 • • 發佈:2019-02-04
目錄結構:
在專案目錄下 建立個名為common的Python包
將common加入到settings檔案中的INSTALLED_APP列表中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions', #
'django.contrib.messages',
'django.contrib.staticfiles',
'book.apps.BookConfig' ,
'common', #相當於是一個進行註冊了的app
]
在common裡面建立目錄templatetages,在目錄裡面建立自定義過濾器及標籤檔案.
**注意:**templatetags這個目錄名字是固定的,而裡面的模組名是自定義的
在common_extras.py檔案中自定義cut和lower的過濾器功能
一.自定義過濾器
# cut 過濾器的功能
def mycut(value,arg):
return value.replace(arg,'')
# 對mycut進行註冊
register.filter('mycut',mycut)
註冊自定義過濾器:
django.template.Library.filter()
1.Library.filter()方法需要兩個引數:
a. 過濾器的名稱(一個字串物件)
b. 編譯的函式 – 一個Python函式(不要把函式名寫成字串)
2.可以把register.filter()用作裝飾器;
3.沒有宣告 name 引數,Django將使用函式名作為過濾器的名字。
例子:
from django import template
register = template.Library() #例項化
# 對mycut進行註冊
register.filter('mycut',mycut)
# 裝飾器 進行註冊
@register.filter
def mylower(value):
return value.lower()
使用自定義過濾器:
#需要使用{% load %}標籤將我們的自定義模組載入進來
{% load %} 宣告將會載入給定模組名中的標籤/過濾器
{% load common_extras %} #要寫在模板檔案第一行
二.自定義標籤
1.簡單標籤django.template.Library.simple_tag()
2.包含標籤django.template.Library.inclusion_tag()
tag()方法有兩個引數:
1. 模板標記的名稱 - 字串。 如果省略,將使用編譯函式的名稱。
2. 編譯的函式 – 一個Python函式(不要把函式名寫成字串)
與過濾器註冊一樣,也可以將其用作裝飾器。
自定義簡單標籤的例子:
1.定義一個顯示當前時間的簡單標籤
@register.simple_tag
def current_time():
return datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')
2.簡單標籤,傳引數,,需傳入時間格式
# 簡單標籤 傳引數
@register.simple_tag
def current_time2(format_string):
return datetime.datetime.now().strftime(format_string)
3.註冊標籤時使用takes_context 引數,則可以使用從上下文中傳入的引數.
# 從上下文中傳進來引數
@register.simple_tag(takes_context=True)
def current_time3(context):
format_string = context.get('format_string')
return datetime.datetime.now().strftime(format_string)
3.模板中使用自定義的標籤
自定義包含標籤的例子:
1.包含標籤的功能是可以通過渲染另外一個模板來顯示一些資料
#例如很多地方都可能會用到下面這幾行程式碼,除了choices這個變數不一樣之外,其他的都是格式都一樣時,那麼我們就可以把這部分程式碼封裝在一個包含標籤中.
# music/show_tags.html
<ul>
{% for i in choices %}
<li>{{ i }}</li>
{% endfor %}
</ul>
@register.inclusion_tag('music/show_tags.html')
def show_result():
ls = ['xxx','yyy','zzz']
return {'choice':ls}
2.包含標籤 模板裡面傳參
@register.inclusion_tag('music/show_tags.html')
def show_result2(choice):
# ls = ['xxx','yyy','zzz']
return {'choice':choice}
模板裡面傳參: {% show_result2 ls %}
3.包含標籤 上下文傳參
@register.inclusion_tag('music/show_tags.html',takes_context=True)
def show_result3(context):
ls = context.get('ls')
return {'choice':ls}
檢視函式(通過上下文傳參的引數在這裡):
def index5(request):
return render(request, 'music/index5.html',
context={'test':'Abc Def Ghi',
'format_string':'%Y/%m/%d %H:%M:%S',
'ls':ls,
}
)