淺談Django自定義模板標(biāo)簽template_tags的用處
自定義模板標(biāo)簽,過濾器。英文翻譯是Customtemplatetagsandfilters。customfilter自定義過濾器今天不在我的記錄范圍之內(nèi),以后用到再看官方文檔也不遲。
**問題1:**customtemplatetags到底長(zhǎng)啥樣?
Manytemplatetagstakeanumberofarguments–stringsortemplatevariables–andreturnaresultafterdoingsomeprocessingbasedsolelyontheinputargumentsandsomeexternalinformation.Forexample,acurrent_timetagmightacceptaformatstringandreturnthetimeasastringformattedaccordingly.
Toeasethecreationofthesetypesoftags,Djangoprovidesahelperfunction,simple_tag.Thisfunction,whichisamethodofdjango.template.Library,takesafunctionthatacceptsanynumberofarguments,wrapsitinarenderfunctionandtheothernecessarybitsmentionedaboveandregistersitwiththetemplatesystem.
(為了降低customtags的難度,你可以使用Django提供的快捷函數(shù)simple_tag)
Ourcurrent_timefunctioncouldthusbewrittenlikethis:
import datetime from django import template register = template.Library()# 只有向系統(tǒng)注冊(cè)過的tags,系統(tǒng)才認(rèn)得你。 @register.simple_tag(takes_context=True)#加上這句后我就是一名合格的template tags def current_time(context, format_string): timezone = context['timezone'] return your_get_current_time_method(timezone, format_string)
Note that the first argument must be called context.
Note that the first argument must be called context.
Note that the first argument must be called context.
@register.simple_tag(takes_context=True) # 這個(gè)裝飾器表明這個(gè)函數(shù)是一個(gè)模板標(biāo)簽,takes_context = True 表示接收上下文對(duì)象,就是前面所說的封裝了各種變量的 Context 對(duì)象。 def paginate(context, object_list ,page_count): # context是Context 對(duì)象,object_list是你要分頁的對(duì)象,page_count表示每頁的數(shù)量 , page_count left = 3 # 當(dāng)前頁碼左邊顯示幾個(gè)頁碼號(hào) -1,比如3就顯示2個(gè) right = 3 # 當(dāng)前頁碼右邊顯示幾個(gè)頁碼號(hào) -1 paginator = Paginator(object_list, page_count) # 通過object_list分頁對(duì)象 page = context['request'].GET.get('page') # 從 Http 請(qǐng)求中獲取用戶請(qǐng)求的頁碼號(hào) try: object_list = paginator.page(page) # 根據(jù)頁碼號(hào)獲取第幾頁的數(shù)據(jù) context['current_page'] = int(page) # 把當(dāng)前頁封裝進(jìn)context(上下文)中 pages = get_left(context['current_page'], left, paginator.num_pages) + get_right(context['current_page'], right, paginator.num_pages) # 調(diào)用了兩個(gè)輔助函數(shù),根據(jù)當(dāng)前頁得到了左右的頁碼號(hào),比如設(shè)置成獲取左右兩邊2個(gè)頁碼號(hào),那么假如當(dāng)前頁是5,則 pages = [3,4,5,6,7],當(dāng)然一些細(xì)節(jié)需要處理,比如如果當(dāng)前頁是2,那么獲取的是pages = [1,2,3,4] except PageNotAnInteger: # 異常處理,如果用戶傳遞的page值不是整數(shù),則把第一頁的值返回給他 object_list = paginator.page(1) context['current_page'] = 1 # 當(dāng)前頁是1 pages = get_right(context['current_page'], right, paginator.num_pages) except EmptyPage: # 如果用戶傳遞的 page 值是一個(gè)空值,那么把最后一頁的值返回給他 object_list = paginator.page(paginator.num_pages) context['current_page'] = paginator.num_pages # 當(dāng)前頁是最后一頁,num_pages的值是總分頁數(shù) pages = get_left(context['current_page'], left, paginator.num_pages) context['article_list'] = object_list # 把獲取到的分頁的數(shù)據(jù)封裝到上下文中 context['pages'] = pages # 把頁碼號(hào)列表封裝進(jìn)去 context['last_page'] = paginator.num_pages # 最后一頁的頁碼號(hào) context['first_page'] = 1 # 第一頁的頁碼號(hào)為1 try: # 獲取 pages 列表第一個(gè)值和最后一個(gè)值,主要用于在是否該插入省略號(hào)的判斷,在模板文件中將會(huì)體會(huì)到它的用處。注意這里可能產(chǎn)生異常,因?yàn)閜ages可能是一個(gè)空列表,比如本身只有一個(gè)分頁,那么pages就為空,因?yàn)槲覀冇肋h(yuǎn)不會(huì)獲取頁碼為1的頁碼號(hào)(至少有1頁,1的頁碼號(hào)已經(jīng)固定寫在模板文件中) context['pages_first'] = pages[0] context['pages_last'] = pages[-1] + 1 # +1的原因是為了方便判斷,在模板文件中將會(huì)體會(huì)到其作用。 except IndexError: context['pages_first'] = 1 # 發(fā)生異常說明只有1頁 context['pages_last'] = 2 # 1 + 1 后的值 return '' # 必須加這個(gè),否則首頁會(huì)顯示個(gè)None
問題2:自定義完標(biāo)簽后,在模板中怎么使用呢?
我的自定義過的標(biāo)簽放在templatetags/paginate_tags.py中
處理函數(shù)
{% load paginate_tags %}#第一步:把文件名包含進(jìn)來 {% paginate blogposts 2 %} #第二步:調(diào)用函數(shù) 添加參數(shù)。注意context參數(shù)不用你傳。
注意:
經(jīng)由defpaginate(context,object_list,page_count):函數(shù)處理過的數(shù)據(jù),在模板中如何使用???
context['article_list'] = object_list # 把獲取到的分頁的數(shù)據(jù)封裝到上下文中 context['pages'] = pages # 把頁碼號(hào)列表封裝進(jìn)去 context['last_page'] = paginator.num_pages # 最后一頁的頁碼號(hào) context['first_page'] = 1 # 第一頁的頁碼號(hào)為1
數(shù)據(jù)輸送到函數(shù)中,進(jìn)行處理,然后將數(shù)據(jù)封裝到之前的context上下文變量中,供template使用,使用方式和使用字典一樣。
總結(jié)
以上就是本文關(guān)于淺談Django自定義模板標(biāo)簽template_tags的用處的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Django框架實(shí)現(xiàn)的普通登錄案例【使用POST方法】
這篇文章主要介紹了Django框架實(shí)現(xiàn)的普通登錄案例,結(jié)合實(shí)例形式分析了Django框架使用POST方法進(jìn)行頁面登錄、校驗(yàn)等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05python探索之BaseHTTPServer-實(shí)現(xiàn)Web服務(wù)器介紹
這篇文章主要介紹了python探索之BaseHTTPServer-實(shí)現(xiàn)Web服務(wù)器介紹,小編覺得還是挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10python2.7讀取文件夾下所有文件名稱及內(nèi)容的方法
python,本身來說是一門高級(jí)編程語言,python它入門簡(jiǎn)單,有基礎(chǔ)的學(xué)起來很快就能有簡(jiǎn)單的應(yīng)用,但是在非常高的抽象計(jì)算中,高級(jí)的python程序設(shè)計(jì)也是非常難學(xué)的。接下來給大家介紹python2.7讀取文件夾下所有文件名稱及內(nèi)容的方法,一起看看吧2018-02-02pycharm中dgl安裝報(bào)錯(cuò)FileNotFoundError:Could not find&nb
這篇文章主要介紹了pycharm中dgl安裝報(bào)錯(cuò)FileNotFoundError:Could not find module ‘E:\XXXX\XXXX\lib\site-packages\dgl\dgl.dl問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02解決Pytorch 訓(xùn)練與測(cè)試時(shí)爆顯存(out of memory)的問題
今天小編就為大家分享一篇解決Pytorch 訓(xùn)練與測(cè)試時(shí)爆顯存(out of memory)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python 3.6打包成EXE可執(zhí)行程序的實(shí)現(xiàn)
這篇文章主要介紹了Python 3.6打包成EXE可執(zhí)行程序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10