1.建立一個模板庫html
使用模板過濾器的時候,直接把過濾器寫在app裏,
例如:在app裏新建一個templatetags的文件夾,這個目錄應當和 models.py 、 views.py 等處於同一層次。例如:
books/
__init__.py
models.py
templatetags/
views.py
在 templatetags 中建立兩個空文件:一個 __init__.py (告訴Python這是一個包含了Python代碼的包)和一個用來存放你自定義的標籤/過濾器定義的文件。第二個文件的名字稍後將用來加載標籤。例如,若是你的自定義標籤/過濾器在一個叫做 poll_extras.py 的文件中,你須要在模板中寫入以下內容: {% load poll_extras %}
{% load %} 標籤檢查 INSTALLED_APPS 中的設置,僅容許加載已安裝的Django應用程序中的模板庫。
要成爲有效的標籤庫,模塊必須包含一個模塊級的變量: register ,這是一個 template.Library 的實例。這個 template.Library 實例是包含全部已註冊的標籤及過濾器的數據結構。所以,在模塊的頂部位置插入下述代碼:
from django import template
register = template.Library() django
2. 自定義模板過濾器
自定義過濾器就是有一個或兩個參數的Python函數::
例如,在過濾器 {{ var|foo:」bar」 }} 中 ,過濾器 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)這裏是一些如何使用過濾器的例子:
{{ somevariable|cut:」0″ }}
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將會使用函數名做爲過濾器的名字
2)保證templatetags在已經INSTALLED_APPS裏面,數據結構
3. 自定義模板標籤
(1)定義標籤
The time is {% current_time 「%Y-%m-%d %I:%M %p」 %}.
(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):
# … app
(4) 簡單標籤的快捷方式
Django 提供了一個幫助函數: simple_tag 。這個函數是 django.template.Library 的一個方法,它接受一個只有一個參數的函數做參數,把它包裝在 render 函數和以前說起過的其餘的必要單位中,而後經過模板系統註冊標籤。
咱們以前的的 current_time 函數因而能夠寫成這樣:
def current_time(format_string):
return datetime.datetime.now().strftime(format_string)
register.simple_tag(current_time)
在Python 2.4中,也可使用修飾語法:
@register.simple_tag
def current_time(token):
…
有關 simple_tag 輔助函數,須要注意下面一些事情:
傳遞給咱們的函數的只有(單個)參數。
在咱們的函數被調用的時候,檢查必需參數個數的工做已經完成了,因此咱們不須要再作這個工做。
參數兩邊的引號(若是有的話)已經被截掉了,因此咱們會接收到一個普通字符串。 函數
5. 包含標籤
(1)定義標籤
{% show_results poll %}
(2)標籤函數
@register.inclusion_tag('books/books_for_author.html')
def show_books_for_author(author):
books = author.book_set.all()
return {'books': books}
(3)標籤模板
<ul>
{% for book in books %}
<li> {{ book }} </li>
{% endfor %}
</ul>ui