欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Django自定義模板標(biāo)簽template_tags的用處

 更新時(shí)間:2017年12月20日 11:08:55   作者:歐吃傘  
這篇文章主要介紹了淺談Django自定義模板標(biāo)簽template_tags的用處,具有一定借鑒價(jià)值,需要的朋友可以參考下。

自定義模板標(biāo)簽,過濾器。英文翻譯是Customtemplatetagsandfilters。customfilter自定義過濾器今天不在我的記錄范圍之內(nèi),以后用到再看官方文檔也不遲。

**問題1:**customtemplatetags到底長(zhǎng)啥樣?

customtemplatetags—github

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ù)參閱本站:

簡(jiǎn)單了解Django模板的使用

獲取Django項(xiàng)目的全部url方法詳解

django實(shí)現(xiàn)用戶登陸功能詳解

如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

最新評(píng)論