Django 自定義模板標籤和過濾器

2021-09-20 06:35:21 字數 3876 閱讀 8864

想要實現自定義標籤和過濾器需要進行準備工作:

準備(必需)工作:

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...