想要實現自定義標籤和過濾器需要進行準備工作:
準備(必需)工作:
polls/
__init__.py
models.py
templatetags/
__init__.py
mytags.py
views.py
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',)
3 接下來在mytags檔案中寫入如下幾行
from django import template
register = template.library()
4 在模板中使用 標籤裝載自定義標籤或者裝飾器,必須先載入自定義模板。
自定義過濾器:1 自定義過濾器實際上就是寫乙個函式
2 django會將過濾器前的值傳入該函式
3 函式完成後,需要進行登記register
因為第二步django已經幫我們完成,所以我們實際上只需要自己完成第一步和第三步
例項:寫乙個自動省略多餘字串的過濾器
1 定義乙個 truncate_chars 函式
# 若字串長度大於30,則省略之後的內容,否則原樣輸出該字串。引數value就是過濾器前的值
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
2 register該函式
# 登記
register.filter('truncate_chars',truncate_chars)
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
library.filter(name,function,is_safe=false,needs_autoescape=false,excepts_localtime=false)函式預設需要兩個引數,name是裝飾器的名稱(字串型別),function是函式名。後面三個引數可以參考 官方文件。 我們也可以通過裝飾器進行登記
@register.filter(name='truncate_filter')
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
如果沒有使用name引數,django缺省會將函式名作為name引數的值,所以下面的**和上面的**作用相同。
@register.filter
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
3 測試模板檔案內容
}
4 瀏覽器顯示結果
自定義標籤
自定義標籤相對於自定義過濾器來說要複雜很多,因為自定義標籤可以做任何事情!
自定義標籤分為很多態別
1 簡單標籤 ****** tags
2 內含標籤 inclusion tags
3 分配標籤 assignment tags
一 簡單標籤
import datetime
from django import template
register = template.library()
@register.******_tag
def current_time(format_string):
return datetime.datetime.now().strftime(format_string)
library.******_tag(takes_context=true) takes_context=true引數可以讓我們訪問模板的當前環境上下文,即將當前環境上下文中的引數和值作為字 典傳入函式中的乙個名為context的引數
@register.******_tag(takes_context=true)
def current_time(context, format_string):
timezone = context['timezone']
return your_get_current_time_method(timezone, format_string)
當使用take_context=true時,函式的第乙個引數必需為context。也可以使用name引數對函式進行重新命名。
二 內含標籤
這種型別的標籤可以被其他模板進行渲染,然後將渲染結果輸出
library.inclusion_tag()支援take_context=true,用法類似library.******_tag()
from django import template
register = template.library()
@register.inclusion_tag('result.html')
def test():
a=['first','second','third']
return
result.html 內容
test.html內容
view函式:
def test(request):
return render(request,'test.html')
當訪問時,瀏覽器顯示:
三 分配標籤
類似於簡單標籤,但並不會輸出結果,可以使用 as 關鍵字將結果賦給乙個引數。
@register.assignment_tag
def get_current_time(format_string):
return datetime.datetime.now().strftime(format_string)
the time is }.
django模板,自定義標籤和filter
注 這悲催的縮排,真是對不起觀眾了,有時間過來修改。自定義標籤大致分為三類 1 非封閉標籤如 2 封閉標籤如 3 inclusion標籤 比如 定義乙個標籤需要做兩方面工作 1 定義編譯函式 2 定義node。編譯函式的作用是將自定義node中的render所需要的引數計算出來,以備使用。比如將自定...
Django入門教程 五 自定義模板標籤和過濾器
3 編寫路由 在urls.py檔案中編寫路由。4 編寫業務邏輯,即檢視函式。5 如何自定義django模板語言的標籤和過濾器 6 在自定義的customtags.py檔案下,編寫乙個進行字串切片的過濾器。from django import template 1 先建立乙個過濾器註冊器,用於註冊自定...
Django 自定義標籤
模版是乙個用django模版語言標記過的python字串。模版可以包含模版標籤和變數。模版標籤是在乙個模版裡起作用的標記。比如,乙個模版標籤可以產生控制結構的內容 if或者for 可以獲取資料庫內容或者訪問其它模版標籤。乙個標籤塊被包圍 變數標籤被 包圍 context是乙個傳遞給模版的key va...