天天看點

django中使用自定義過濾器和自定義标簽

自定義過濾器

首先在app底下建立一個templatetags目錄,裡面添加兩個檔案,目錄結構如下:

django中使用自定義過濾器和自定義标簽

然後在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檔案,啟動伺服器,在浏覽器通路就可以看到替換後的效果了:

django中使用自定義過濾器和自定義标簽

自定義标簽

自定義标簽和上面的步驟一樣,隻是定義的形式有所改變(自定義标簽,格式化傳回目前時間):

# 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)
           

在模闆中使用:

django中使用自定義過濾器和自定義标簽