Python(四十九)自定義過濾器及標簽

從2021年9月2日發(fā)文至今调鬓,Python系列(包括代碼在內(nèi))共計92026個字工坊、四十九篇聪全!

1. 關(guān)于自定義

1.1. 什么是自定義:

根據(jù)一定規(guī)則,自己定義出符合需求功能的.

1.2. 自定義可以用在哪里:

用在任何你有需求的地方熏矿。

1.3. 為什么需要自定義:

因為內(nèi)置的滿足不了我們的需求艰亮。

1.4. 怎么做自定義:

不同的東西有不同的定義規(guī)則装处。

2. 文件路徑配置

templates存放模板的目錄误债。
templatetags存放自定義標簽及過濾器的目錄。(目錄名只能取這個妄迁,不能更改)

創(chuàng)建自定義方法文件common_extra.py:

該文件夾common也需要在主路由的settings里面注冊寝蹈,如下圖所示:

3. 自定義過濾器

先導(dǎo)入template這個模塊,然后通過register = template.Library():生成一個注冊器登淘,這個變量名必須為register箫老。

自定義模板過濾器的文件common_extra.py代碼:
# 自定義過濾器及標簽:一、自定義過濾器

from django import template

register = template.Library()       # 生成一個注冊器形帮,該變量名稱不能更改槽惫,只能為register

# 注冊自定義過濾器方法一
def my_upper(values):       # 一定要帶至少一個參數(shù)
    return values.upper()

register.filter(my_upper)
# register.filter('up',my_upper)   # 可以給他取名字,調(diào)用時直接使用改的名字即可

# 注冊自定義過濾器方法二
@register.filter        # 不想取名寫法
# @register.filter('up')      # 使用裝飾器會自動調(diào)用該函數(shù)辩撑,想取名寫法界斜。
def my_upper(values):
    return values.upper

@register.filter
def my_sort(values):
    return sorted(values)      # sorted有返回值,且不單單可以給列表排序合冀;而sort方法只能給列表排序且是直接更改原列表各薇,沒有返回值

@register.filter
def multiplication(values,x):
    num =  values * x
    return num

模板過濾器分析:{{ var|foo:"bar" }}:var:變量;foo:過濾器;bar:參數(shù)峭判。

自定義過濾器就是一個帶有一個或兩個參數(shù)的Python 函數(shù):

  • (輸入的)變量的值 —— 不一定是字符串形式开缎。
  • 參數(shù)的值 —— 可以有一個初始值,或者完全不要這個參數(shù)林螃。
自定義模板過濾器的文件index.html代碼:

{% load common_extra %}:將自定義過濾器奕删、標簽所在的文件進行加載

{% load common_extra %}     {# 將自定義過濾器、標簽所在的文件進行加載 #}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>django</title>
</head>
<body>

{# 自定義過濾器及標簽:一疗认、自定義過濾器 #}

{{ name }}<br>
內(nèi)置過濾器:{{ name|upper }}<br>
使用自定義過濾器:{{ name|upper }}<br>
{#使用自定義取了別名的過濾器{{ name|up }}<br>#}

{{ li2 }}<br>
使用自定義過濾器:{{ li2|my_sort }}<br>

{{ num1 }}<br>
使用自定義過濾器:{{ num1|multiplication:1 }}<br>
使用自定義過濾器:{{ num1|multiplication:'3,1,2,3' }}<br>

</body>
</html>
分路由book的views.py代碼:
"""三完残、模板過濾器"""
from django.shortcuts import render
import datetime
str1 = 'I like django'
tu1 = ('a','b','c','d')
li1 = ['q','w','e',1,2,3]
li2 = ['q','w','e','a','b','c']
dic = {'a':1,'b':2,'c':3}

def temp_1(request):
    return render(request,'book/index.html',context={
        'name':'python chenhong',
        'name1':'PYTHON CHENHONG',
        'age':20,
        'nn':None,
        'li1':li1,
        'li2':li2,
        'dic1':dic,
        'tu1':tu1,
        'str1':str1,
        'null':'',
        'num1':1,
        'num2':2,
        'now':datetime.datetime.now,
        'html':'<h2> this is H2 </h2>',
        'float':3.1415926,
        'gt':'&gt;',
        'format_time':'%Y年%m月%d日 %H:%M:%S',
    })
分路由book的urls.py代碼:
from django.urls import path
# 從同級目錄下導(dǎo)入文件
from . import views

urlpatterns = [
    path('temp_1/',views.temp_1),
]
主路由的urls.py代碼:
from django.contrib import admin
from django.urls import path,re_path,include
# 從同級目錄下導(dǎo)入文件
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/',include('book.urls')),      # 給book app分配一個子路由,訪問的是整個文件
]

4. 自定義標簽

簡單標簽django.template.Library.simple_tag()
包含標簽django.template.Library.inclusion_tag()
tag()方法有兩個參數(shù):

  1. 模板標記的名稱 - 字符串横漏。 如果省略谨设,將使用編譯函數(shù)的名稱。
  2. 編譯的函數(shù) – 一個Python函數(shù)(不要把函數(shù)名寫成字符串)與過濾器注冊一樣缎浇,也可以將其用作裝飾器扎拣。
自定義模板標簽的文件common_extra.py代碼:

先導(dǎo)入template這個模塊,然后通過register = template.Library():生成一個注冊器素跺,這個變量名必須為register二蓝。

# 自定義過濾器及標簽:二、自定義模板標簽

from django import template

register = template.Library()       # 生成一個注冊器亡笑,該變量名稱不能更改侣夷,只能為register

# 簡單標簽
import datetime

# 無參數(shù)情況——格式化時間
@register.simple_tag
def current_time():
    format_time = '%Y年%m月%d日 %H:%M:%S'
    return datetime.datetime.now().strftime(format_time)

# 有參數(shù)情況——格式化時間
@register.simple_tag
def current_time1(format_time):
    return datetime.datetime.now().strftime(format_time)

# 獲取上下文數(shù)據(jù)
@register.simple_tag(takes_context=True)        # takes_context這個值決定要不要獲取視圖函數(shù)里面的數(shù)據(jù)横朋,如果要仑乌,則設(shè)為True,默認為None
def current_time2(context):     # 獲取視圖函數(shù)里context里的參數(shù)
    ft = context.get('format_time')
    return datetime.datetime.now().strftime(ft)


# 自定義包含標簽
# 無參數(shù)情況
@register.inclusion_tag('book/include_tag.html')
def show_data():
    li = ['墨染','追風(fēng)','彭于晏','蘇格拉底','北斗','小白']
    return {'values':li}

# 有參數(shù)情況
@register.inclusion_tag('book/include_tag.html')
def show_data1(li):
    return {'values':li}

# 上下文數(shù)據(jù)
@register.inclusion_tag('book/include_tag.html',takes_context=True)
def show_data2(context):
    tu1 = context.get('tu1')
    li1 = context.get('li1')
    return {'values':tu1,'li1':li1}
自定義模板標簽的文件index.html代碼:

{% load common_extra %}:將自定義過濾器琴锭、標簽所在的文件進行加載

{% load common_extra %}     {# 將自定義過濾器晰甚、標簽所在的文件進行加載 #}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>django</title>
</head>
<body>

{# 自定義過濾器及標簽:二、自定義模板標簽 #}

{# 模板標簽無參數(shù)决帖,空格隔開寫參數(shù)名稱 #}
{% current_time %}<br>

{# 模板標簽有參數(shù)厕九,空格隔開寫參數(shù)名稱 #}
{% current_time1 '%Y年%m月%d日 %H:%M:%S' %}<br>

{# 通過上下文數(shù)據(jù)接收方法來渲染 #}
{% current_time2 %}<br>


{# 包含標簽 #}
{% show_data %}<br>

{#這里只能放一個參數(shù)#}
{% show_data1 tu1 %}<br>

{#這里可以放多個參數(shù),上下文數(shù)據(jù)處理#}
{% show_data2 %}<br>

</body>
</html>
分路由book的views.py代碼:
"""
三地回、模板過濾器
自定義過濾器及標簽:一、自定義模板過濾器;二搓劫、自定義模板標簽
"""
from django.shortcuts import render
import datetime
str1 = 'I like django'
tu1 = ('a','b','c','d')
li1 = ['q','w','e',1,2,3]
li2 = ['q','w','e','a','b','c']
dic = {'a':1,'b':2,'c':3}

def temp_1(request):
    return render(request,'book/index.html',context={
        'name':'python chenhong',
        'name1':'PYTHON CHENHONG',
        'age':20,
        'nn':None,
        'li1':li1,
        'li2':li2,
        'dic1':dic,
        'tu1':tu1,
        'str1':str1,
        'null':'',
        'num1':1,
        'num2':2,
        'now':datetime.datetime.now,
        'html':'<h2> this is H2 </h2>',
        'float':3.1415926,
        'gt':'&gt;',
        'format_time':'%Y年%m月%d日 %H:%M:%S',
    })

創(chuàng)建一個模板標簽的上下文數(shù)據(jù)文件include_tag.html:


模板標簽的上下文數(shù)據(jù)文件include_tag.html代碼:
{# 自定義過濾器及標簽:二短荐、自定義模板標簽 #}
{# 包含標簽 #}
<ul>
    {% for i in values %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>

<ul>
    {% for i in li1 %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>
分路由book的urls.py代碼:
from django.urls import path
# 從同級目錄下導(dǎo)入文件
from . import views

urlpatterns = [
    path('temp_1/',views.temp_1),
]
主路由的urls.py代碼:
from django.contrib import admin
from django.urls import path,re_path,include
# 從同級目錄下導(dǎo)入文件
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/',include('book.urls')),      # 給book app分配一個子路由,訪問的是整個文件
]

文章到這里就結(jié)束了细睡!希望大家能多多支持Python(系列)谷羞!六個月帶大家學(xué)會Python,私聊我溜徙,可以問關(guān)于本文章的問題湃缎!以后每天都會發(fā)布新的文章犀填,喜歡的點點關(guān)注!一個陪伴你學(xué)習(xí)Python的新青年嗓违!不管多忙都會更新下去九巡,一起加油!

Editor:Lonelyroots

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載蹂季,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者比庄。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乏盐,隨后出現(xiàn)的幾起案子佳窑,更是在濱河造成了極大的恐慌,老刑警劉巖父能,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件神凑,死亡現(xiàn)場離奇詭異,居然都是意外死亡何吝,警方通過查閱死者的電腦和手機溉委,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爱榕,“玉大人瓣喊,你說我怎么就攤上這事∏郑” “怎么了藻三?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長跪者。 經(jīng)常有香客問我棵帽,道長,這世上最難降的妖魔是什么渣玲? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任逗概,我火速辦了婚禮,結(jié)果婚禮上忘衍,老公的妹妹穿的比我還像新娘逾苫。我一直安慰自己,他們只是感情好枚钓,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布铅搓。 她就那樣靜靜地躺著,像睡著了一般秘噪。 火紅的嫁衣襯著肌膚如雪狸吞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音蹋偏,去河邊找鬼便斥。 笑死,一個胖子當(dāng)著我的面吹牛威始,可吹牛的內(nèi)容都是我干的枢纠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼黎棠,長吁一口氣:“原來是場噩夢啊……” “哼晋渺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脓斩,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤木西,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后随静,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體八千,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年燎猛,在試婚紗的時候發(fā)現(xiàn)自己被綠了恋捆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡重绷,死狀恐怖沸停,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昭卓,我是刑警寧澤愤钾,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站葬凳,受9級特大地震影響绰垂,放射性物質(zhì)發(fā)生泄漏室奏。R本人自食惡果不足惜火焰,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胧沫。 院中可真熱鬧昌简,春花似錦、人聲如沸绒怨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽南蹂。三九已至犬金,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晚顷。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工峰伙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人该默。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓瞳氓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親栓袖。 傳聞我的和親對象是個殘疾皇子匣摘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359