準備(必需)工作:
1 在某個app下創建一個名為templatetags(必需,且包名不可變)的包。假設我們在名為polls的app下創建了一個templatetags的包,并在該包下創建了一個名為mytags的文件。那么目錄結構看起來應該就像這樣:
1
2
3
4
5
6
7
|
polls/ __init__.py models.py templatetags/ __init__.py mytags.py views.py |
2 settings文件中的INSTALLD_APPS內必須含有該app。接下來,我們需要確認settings文件中的INSTALLED_APPS變量中已經有了polls
1
2
3
4
5
6
7
8
9
|
INSTALLED_APPS = ( 'django.contrib.auth' , 'django.contrib.contenttypes' , 'django.contrib.sessions' , 'django.contrib.messages' , 'django.contrib.staticfiles' , 'polls' , ) |
3 接下來在mytags文件中寫入如下幾行
1
2
3
|
from django import template register = template.Library() |
4 在模板中使用{% load %} 標簽裝載自定義標簽或者裝飾器
1
|
{ % load mytags % } |
自定義過濾器:
1 自定義過濾器實際上就是寫一個函數
2 django會將過濾器前的值傳入該函數
3 函數完成后,需要進行登記register
因為第二步django已經幫我們完成,所以我們實際上只需要自己完成第一步和第三步
實例:寫一個自動省略多余字符串的過濾器
1 定義一個 truncate_chars 函數
1
2
3
4
5
6
|
# 若字符串長度大于30,則省略之后的內容,否則原樣輸出該字符串。參數value就是過濾器前的值 def truncate_chars(value): if value.__len__() > 30 : return '%s......' % value[ 0 : 30 ] else : return value |
2 register該函數
1
2
3
4
5
6
7
|
# 登記 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是函數名。后面三個參數可以參考 官方文檔。 我們也可以通過裝飾器進行登記
1
2
3
4
5
6
|
@register . filter (name = 'truncate_filter' ) def truncate_chars(value): if value.__len__() > 30 : return '%s......' % value[ 0 : 30 ] else : return value |
如果沒有使用name參數,django默認會將函數名作為name參數的值,所以下面的代碼和上面的代碼作用相同。
1
2
3
4
5
6
|
@register . filter def truncate_chars(value): if value.__len__() > 30 : return '%s......' % value[ 0 : 30 ] else : return value |
3 測試模板文件內容
1
2
3
4
5
6
7
8
9
10
11
|
{% load mytags %} <!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" > < title >Title</ title > </ head > < body > {{ 'alskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdffalskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdff'|truncate_chars }} </ body > </ html > |
4 瀏覽器顯示結果
自定義標簽
自定義標簽相對于自定義過濾器來說要復雜很多,因為自定義標簽可以做任何事情!
自定義標簽分為很多類型
1 簡單標簽 Simple tags
2 內含標簽 Inclusion tags
3 分配標簽 Assignment tags
一 簡單標簽
1
2
3
4
5
6
7
8
|
import datetime from django import template register = template.Library() @register .simple_tag def current_time(format_string): return datetime.datetime.now().strftime(format_string) |
Library.simple_tag(takes_context=True) takes_context=True參數可以讓我們訪問模板的當前環境上下文,即將當前環境上下文中的參數和值作為字典傳入函數中的一個名為context的參數
1
2
3
4
|
@register .simple_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.simple_tag()
1
2
3
4
5
6
7
|
from django import template register = template.Library() @register .inclusion_tag( 'result.html' ) def test(): a = [ 'first' , 'second' , 'third' ] return { 'choices' :a} |
result.html 內容
1
2
3
4
5
|
< ul > {% for choice in choices %} < li > {{ choice }} </ li > {% endfor %} </ ul > |
test.html內容
1
2
3
4
5
6
7
8
9
10
11
|
{% load mytags %} <!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" > < title >Title</ title > </ head > < body > {% test %} </ body > </ html > |
view函數:
1
2
|
def test(request): return render(request, 'test.html' ) |
當訪問http://127.0.0.1:8000/test/時,瀏覽器顯示:
三 分配標簽
類似于簡單標簽,但并不會輸出結果,可以使用 as 關鍵字將結果賦給一個參數。
1
2
3
|
@register .assignment_tag def get_current_time(format_string): return datetime.datetime.now().strftime(format_string) |
1
2
|
{% get_current_time "%Y-%m-%d %I:%M %p" as the_time %} < p >The time is {{ the_time }}.</ p > |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/MnCu8261/p/5934203.html