django模板,自定義標籤和filter

2022-08-24 21:27:09 字數 3835 閱讀 1683

注:這悲催的縮排,真是對不起觀眾了,有時間過來修改。

自定義標籤大致分為三類:

1、非封閉標籤如

2、封閉標籤如

3、inclusion標籤 比如

定義乙個標籤需要做兩方面工作:1、定義編譯函式 2、定義node。

編譯函式的作用是將自定義node中的render所需要的引數計算出來,以備使用。比如將自定義tag中的引數等分離出來,或是將封閉標籤中的nodelist算出來。自定義node的目的是提供該標籤的render函式,將結果返回,或者存放在context中

非封閉標籤

以定義為例

1)定義編譯函式:

from django import template

register = template.library()

@register.tag(name="

current_time

")def do_current_time(parser, token):

try:

#split_contents() knows not to split quoted strings.

tag_name, format_string = token.split_contents()

except valueerror:

msg = '

%r tag requires a single argument

' % token.split_contents()[0]

raise template.templatesyntaxerror(msg)

return currenttimenode(format_string[1:-1])

2)定義node

import datetime

class currenttimenode(template.node):

def__init__(self, format_string):

self.format_string = str(format_string)

def render(self, context):

now = datetime.datetime.now()

return now.strftime(self.format_string)

import re

class currenttimenode3(template.node):

def__init__(self, format_string, var_name):

self.format_string = str(format_string)

self.var_name = var_name

def render(self, context):

now = datetime.datetime.now()

context[self.var_name] = now.strftime(self.format_string)

return

''

另外乙個非封閉標籤中比較常用、比較複雜的乙個例子

自定義tag:

def do_current_time(parser, token):

#this version uses a regular expression to parse tag contents.

try:

#splitting by none == splitting by spaces.

tag_name, arg = token.contents.split(none, 1)

except valueerror:

msg = '

%r tag requires arguments

' % token.contents[0]

raise template.templatesyntaxerror(msg)

m = re.search(r'

(.*?) as (\w+)

', arg)

if m:

fmt, var_name = m.groups()

else:

msg = '

%r tag had invalid arguments

' % tag_name

raise template.templatesyntaxerror(msg)

ifnot (fmt[0] == fmt[-1] and fmt[0] in ('

"', "

'")):

msg = "

%r tag's argument should be in quotes

" % tag_name

raise template.templatesyntaxerror(msg)

return currenttimenode3(fmt[1:-1], var_name)

封閉標籤,

以為例

def do_upper(parser, token):

"""將兩個標籤之間的node儲存到nodelist,然後傳入uppernode類供處理

"""nodelist = parser.parse(('

endupper

',))

parser.delete_first_token()

return uppernode(nodelist)

class uppernode(template.node):

def__init__(self, nodelist):

self.nodelist = nodelist

"""呼叫nodelist中node的render()方法,然後將返回的內容儲存在output中,最後對output做大寫操作

"""def render(self, context):

output = self.nodelist.render(context)

return output.upper()

inclusion 標籤

inclusion tag,該tag需要乙個模板配合它。比如

只需要兩方面工作,一是定義乙個函式,以自定義標籤的引數(本例中的author)函式的形參,返回值作為模板檔案的輸入引數(本例中的)。二是定義乙個模板

tag檔案

@register.inclusion_tag('

book_snippet.html

')def books_for_author(author):

books = book.objects.filter(authors__id=author.id)

return

模板檔案:

book_snippet.html

<

ul>

<

li>}

li>

ul>

自定義filter

from django import template

register = template.library()

@register.filter(name='

cut')

def cut(value, arg):

return value.replace(arg, '')

使用方法: }

這裡的somevariable便是cut中的value,「 」便是arg,整個filter的作用是將somevariable中的「 」(空格)替換成'',也即去掉somevariable中的空格

Django 自定義標籤

模版是乙個用django模版語言標記過的python字串。模版可以包含模版標籤和變數。模版標籤是在乙個模版裡起作用的標記。比如,乙個模版標籤可以產生控制結構的內容 if或者for 可以獲取資料庫內容或者訪問其它模版標籤。乙個標籤塊被包圍 變數標籤被 包圍 context是乙個傳遞給模版的key va...

Django 自定義標籤

新建乙個資料夾mydefined裡面在新建乙個templatetags在裡面新建mytags.py mytags.py 劉文豪 大帥哥 from django import template register template.library 建立模板物件 定義模板節點 class reversal...

django 模板繼承 元件 自定義標籤

base.html 被繼承的檔案 模板 lang en rel stylesheet href style.css my amazing sitetitle head content testli testli ul div body html home.html 繼承模板 保證兩個檔案在同一目錄 ...