django 自定義模板標籤和過濾器
1.建立乙個模板庫
books/
__init__.py
models.py
templatetags/
views.py
在 templatetags 中建立兩個空檔案:乙個 __init__.py (告訴python這是乙個包含了python**的包)和乙個用來存放你自定義的標籤/過濾器定義的檔案。第二個檔案的名字稍後將用來載入標籤。例如,如果你的自定義標籤/過濾器在乙個叫作 poll_extras.py 的檔案中,你需要在模板中寫入如下內容:
要成為有效的標籤庫,模組必須包含乙個模組級的變數: register ,這是乙個 template.library 的例項。這個 template.library 例項是包含所有已註冊的標籤及過濾器的資料結構。因此,在模組的頂部位置插入下述**:
from django import template
register = template.library()
2. 自定義模板過濾器
自定義過濾器就是有乙個或兩個引數的python函式::
例如,在過濾器 } 中 ,過濾器 foo 會被傳入變數 var 和引數 bar 的內容。
過濾器函式應該總有返回值,而且不能觸發異常,它們都應該靜靜的失敗。如果有乙個錯誤發生,它們要麼返回原始的輸入字串,要麼返回空的字串,無論哪個都可以。
1)這裡是一些定義過濾器的例子:
def cut(value, arg):
"removes all values of arg from the given string"
return value.replace(arg, '')
def lower(value): # only one argument.
"converts a string into all lowercase"
return value.lower()
2)這裡是一些如何使用過濾器的例子:
} 3)下面是乙個完整的模板庫的例子,提供了乙個 cut 過濾器:
from django import template
register = template.library()
@register.filter(name='cut') (裝飾器)
def cut(value, arg):
return value.replace(arg, '')
@register.filter
def lower(value):
return value.lower()
注意:1)在定義過濾器時,需要用 library 例項來註冊它,這樣就能通過django的模板語言來使用了: python 2.4或更新,可以通過上面的裝飾器 實現,如果不使用 name 引數,@register.filter那麼django將會使用函式名作為過濾器的名字
3. 自定義模板標籤
(1)定義標籤
the time is .
(2)編寫模板標籤分析器mytag.py
from django import template
def do_current_time(parser, token):
try:
# split_contents() knows not to split quoted strings.
tag_name, format_string = token.split_contents()
except valueerror:
msg = '%r tag requires a single argument' % token.contents()[0]
raise template.templatesyntaxerror(msg)
return currenttimenode(format_string[1:-1])
(3) 編寫模板節點
import datetime
class currenttimenode(template.node):
def __init__(self, format_string):
self.format_string = format_string
def render(self, context):
now = datetime.datetime.now()
return now.strftime(str(self.format_string))
(4) 註冊標籤
register = template.library()
register.tag(』current_time』, do_current_time)
或 @register.tag(name=」current_time」)
def do_current_time(parser, token):
# …
(4) 簡單標籤的快捷方式
django 提供了乙個幫助函式: ******_tag 。這個函式是 django.template.library 的乙個方法,它接受乙個只有乙個引數的函式作引數,把它包裝在 render 函式和之前提及過的其他的必要單位中,然後通過模板系統註冊標籤。
我們之前的的 current_time 函式於是可以寫成這樣:
def current_time(format_string):
return datetime.datetime.now().strftime(format_string)
register.******_tag(current_time)
在python 2.4中,也可以使用修飾語法:
@register.******_tag
def current_time(token):
… 有關 ******_tag 輔助函式,需要注意下面一些事情:
傳遞給我們的函式的只有(單個)引數。
在我們的函式被呼叫的時候,檢查必需引數個數的工作已經完成了,所以我們不需要再做這個工作。
引數兩邊的引號(如果有的話)已經被截掉了,所以我們會接收到乙個普通字串。
5. 包含標籤
(1)定義標籤
(2)標籤函式
@register.inclusion_tag('books/books_for_author.html')
def show_books_for_author(author):
books = author.book_set.all()
return
(3)標籤模板
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...