有的時候框架給的過濾器不夠用,須要自定義一些過濾器,因此就須要咱們本身來定義一些過濾器等html
某個app特用(獨有)的 - app 目錄下的 templatetags文件夾內(文件夾內須要有__init__.py文件)python
公用的 - 再建立一個新的app,而後在新的app中建立templatetags(固定的單詞寫法)文件夾,可是須要在setting文件中的INSTALL_APPS中註冊,而後就能夠應用了django
在templatetags的文件夾下建立py文件(通常是叫customer_filters),過濾器寫在文件內:app
模板過濾器是一個函數,有一個或者兩個參數框架
- 第一個參數,是傳遞進來的模板變量 - 第二個參數,是普通的參數,也能夠是默認的,也能夠不要
1 過濾器範式: 2 def func(value,arg='zh'): 3 map ={ 4 'zh':('女','男'), 5 'en':('female','male') 6 } 7 return map[arg][value] 8 9 實現須要返回的值
經過 django.template.Library 它的實例的filter 方法函數
1 filter 有兩個參數: 2 - name:過濾器的名稱,是個字符串,能夠不寫,默認使用方法名(函數名)做爲過濾器的名稱 3 - filter_func 定義的過濾器的函數 4 5 #導包 6 from django.template import Library 7 8 #生成實例 9 register = Library()
第一種方法:佈局
1 def func(): 2 return '我是一個例子' 3 4 #把函數丟進來。即註冊成功,能夠簡寫成register.filter(func) 5 register.filter('funcname',func) 6 #第一個參數表示調用的name,第二個參數表示函數名
第二種方法:經過裝飾器方法來註冊spa
1 #name這個參數能夠不寫,默認調用函數名 2 @register.filter(name=funcname) 3 def func() 4 return '我是一個例子'
1 {% load customer_filters %}
在templatetags的文件夾下建立py文件(通常是叫customer_tags)3d
1 簡單標籤範式:顯示當前時間的標籤 2 from datetime import datetime 3 4 #註冊方法 5 from django.template import Library 6 register = Library() 7 8 #當前時間的函數標籤 9 def current_time(format): 10 return datetime.now().strftime(format)
註冊的第一種方式:code
1 #註冊簡單標籤:第一種方式註冊 2 register.simple_tag(current_time, name='current')
註冊的第二種方式:
1 #註冊簡單標籤:第二種方式註冊,裝飾器方式的寫法,寫在函數上便可 2 @register.simple_tag(name='current')
1 #load下templatetags的文件夾下建立的標籤函數的py文件名 2 {% load customer_tags%}
1 #應用簡單標籤,名字和參數用空格隔開便可,後面是參數 2 {% current '%Y-%m-%d %H:%M:%S %}
引用上下文變量,此處簡單標籤的參數,也可使用成views中render傳遞到模板中的context裏面的數據。 須要在simple_tag中,設置參數take_context=True
1 標籤函數的文件中,註冊的時候添加takes_context參數 2 @register.simple_tag(name='current',takes_context=True) 3 4 在定義函數的時候,第一個參數必須且必定是context; 5 def current_time(context,format_str):
-包含標籤,經過渲染另一個html模板來展現數據 django.template.Library.inclusion_tag()
須要建立一個html模板文件,能夠建立在templates文件夾下的同級html文件中,也能夠在其下面建立一個新的文件夾來存放html模板。
1 渲染的html模板 2 <ul> 3 <!--這裏的ls對應的下面函數返回標籤內的key--> 4 {% for i in ls %} 5 <li>{{ i }}</li> 6 {% endfor %} 7 </ul>
內容寫在簡單標籤customer_tags的文件中
1 #註冊方法 2 from django.template import Library 3 register = Library() 4 5 #註冊,並把須要渲染的模板丟進來, 6 @register.inclusion_tag('teacher/show_list_as_ul.html') 7 8 def show_list_as_ur(value): 9 return {'ls':value}
1 #load在templatetags的文件夾下建立的標籤函數的py文件名 2 {% load customer_tags%} 3 4 #應用簡單標籤,名字和參數用空格隔開便可,後面是參數 5 {% show_list_as_ul stu.course %}
例子: 本來的課程展示方式
經過包含標籤渲染後: 根據自定義的方式展示出來。
標籤函數
1 from django.template import Library 2 register = Library() 3 4 @register.inclusion_tag('teacher/show_list_as_ul.html') 5 def show_list_as_ur(value, style): 6 return {'ls':value,'style':style}
html模板語法:
1 函數內的參數在此處的對應 2 {% if style == 'button' %} 3 <div class="list-gtoup"> 4 {% for i in ls %} 5 <button type="button" class="list-group-item">{{ i }}<button> 6 {% endfor % 7 </div> 8 {% endif %} 9 10 #還能夠寫上elif和else 11 {% endif %}
html中的用法
標籤函數+空格+數據+空格+標籤中的參數 <td>{% show_list_as_ul stu.course ''%}</td>
渲染以後的效果:
原文出處:https://www.cnblogs.com/hua888/p/10432756.html