想要實現自定義標簽和過濾器需要進行準備工作:
準備(必需)工作:
1 在某個app下創建一個名為templatetags(必需,且包名不可變)的包。假設我們在名為polls的app下創建了一個templatetags的包,并在該包下創建了一個名為mytags的文件。那么目錄結構看起來應該就像這樣:
polls/ __init__.py models.py templatetags/ __init__.py mytags.py views.py
2 settings文件中的INSTALLD_APPS內必須含有該app。接下來,我們需要確認settings文件中的INSTALLED_APPS變量中已經有了polls
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'polls',)
3 接下來在mytags文件中寫入如下幾行
from django import templateregister = template.Library()
4 在模板中使用{% load %} 標簽裝載自定義標簽或者裝飾器
{% load mytags %}自定義過濾器:
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 valueLibrary.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.filterdef truncate_chars(value): if value.__len__() > 30: return '%s......'% value[0:30] else: return value
3 測試模板文件內容
{% load mytags %}<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>Title</title></head><body>{{ 'alskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdffalskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdff'|truncate_chars }}</body></html>            
新聞熱點
疑難解答