自定義過濾器
首先在app底下建立一個templatetags目錄,裡面添加兩個檔案,目錄結構如下:
然後在settings.py中把templatetags目錄作為app注冊
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp.apps.MyappConfig',
'myapp.templatetags', # 作為app注冊
]
然後在extratags.py檔案中添加自定義的過濾器:
from django import template
register = template.Library()
@register.filter(name='cut') # 過濾器在模闆中使用時的name
def myCut(value, arg): # 把傳遞過來的參數arg替換為'~'
return value.replace(arg, '~')
編輯視圖函數,把value傳遞給模闆檔案:
def index(request):
return render(request, 'one.html', {'value':'Hello, dandan!'})
在模闆檔案中使用的時候,要先導入extra_tags.py檔案:
{% load extra_tags %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# 把value中的“!”替換掉#}
{{ value | cut:'!' }}
</body>
</html>
編輯好urls.py檔案,啟動伺服器,在浏覽器通路就可以看到替換後的效果了:
自定義标簽
自定義标簽和上面的步驟一樣,隻是定義的形式有所改變(自定義标簽,格式化傳回目前時間):
# extra_tags.py
# 自定義标簽,格式化傳回目前時間
@register.tag(name='current_time')
# 解析器
def do_current_time(parse, token): # parse解析器對象,token被解析的對象,包含标簽的名字和格式化的格式
try:
tag_name, format_string = token.split_contents()
except:
raise template.TemplateSyntaxError('syntax')
return CurrentNode(format_string[:-]) # 傳入模闆中的節點類
import datetime
class CurrentNode(template.Node):
def __init__(self, format):
self.format_string = str(format)
# 把目前時間格式化後傳回
def render(self, context):
now = datetime.datetime.now()
return now.strftime(self.format_string)
在模闆中使用: