詳解django中自定義標簽和過濾器
想要實現(xiàn)自定義標簽和過濾器需要進行準備工作:
準備(必需)工作:
1 在某個app下創(chuàng)建一個名為templatetags(必需,且包名不可變)的包。假設我們在名為polls的app下創(chuàng)建了一個templatetags的包,并在該包下創(chuàng)建了一個名為mytags的文件。那么目錄結構看起來應該就像這樣:
polls/
__init__.py
models.py
templatetags/
__init__.py
mytags.py
views.py
2 settings文件中的INSTALLD_APPS內必須含有該app。接下來,我們需要確認settings文件中的INSTALLED_APPS變量中已經有了polls
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'polls', )
3 接下來在mytags文件中寫入如下幾行
from django import template register = template.Library()
4 在模板中使用{% load %} 標簽裝載自定義標簽或者裝飾器
{% load mytags %}
自定義過濾器:
1 自定義過濾器實際上就是寫一個函數(shù)
2 django會將過濾器前的值傳入該函數(shù)
3 函數(shù)完成后,需要進行登記register
因為第二步django已經幫我們完成,所以我們實際上只需要自己完成第一步和第三步
實例:寫一個自動省略多余字符串的過濾器
1 定義一個 truncate_chars 函數(shù)
# 若字符串長度大于30,則省略之后的內容,否則原樣輸出該字符串。參數(shù)value就是過濾器前的值
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
2 register該函數(shù)
# 登記
register.filter('truncate_chars',truncate_chars)
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
Library.filter(name,function,is_safe=False,needs_autoescape=False,excepts_localtime=False)函數(shù)默認需要兩個參數(shù),name是裝飾器的名稱(字符串類型),function是函數(shù)名。后面三個參數(shù)可以參考 官方文檔。 我們也可以通過裝飾器進行登記
@register.filter(name='truncate_filter')
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
如果沒有使用name參數(shù),django默認會將函數(shù)名作為name參數(shù)的值,所以下面的代碼和上面的代碼作用相同。
@register.filter
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
3 測試模板文件內容
{% load mytags %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ 'alskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdffalskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdff'|truncate_chars }}
</body>
</html>
4 瀏覽器顯示結果

自定義標簽
自定義標簽相對于自定義過濾器來說要復雜很多,因為自定義標簽可以做任何事情!
自定義標簽分為很多類型
1 簡單標簽 Simple tags
2 內含標簽 Inclusion tags
3 分配標簽 Assignment tags
一 簡單標簽
import datetime from django import template register = template.Library() @register.simple_tag def current_time(format_string): return datetime.datetime.now().strftime(format_string)
Library.simple_tag(takes_context=True) takes_context=True參數(shù)可以讓我們訪問模板的當前環(huán)境上下文,即將當前環(huán)境上下文中的參數(shù)和值作為字典傳入函數(shù)中的一個名為context的參數(shù)
@register.simple_tag(takes_context=True) def current_time(context, format_string): timezone = context['timezone'] return your_get_current_time_method(timezone, format_string)
當使用take_context=True時,函數(shù)的第一個參數(shù)必需為context。也可以使用name參數(shù)對函數(shù)進行重命名。
二 內含標簽
這種類型的標簽可以被其他模板進行渲染,然后將渲染結果輸出
Library.inclusion_tag()支持take_context=True,用法類似Library.simple_tag()
from django import template
register = template.Library()
@register.inclusion_tag('result.html')
def test():
a=['first','second','third']
return {'choices':a}
result.html 內容
<ul>
{% for choice in choices %}
<li> {{ choice }} </li>
{% endfor %}
</ul>
test.html內容
{% load mytags %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% test %}
</body>
</html>
view函數(shù):
def test(request): return render(request,'test.html')
當訪問http://127.0.0.1:8000/test/時,瀏覽器顯示:
三 分配標簽
類似于簡單標簽,但并不會輸出結果,可以使用 as 關鍵字將結果賦給一個參數(shù)。
@register.assignment_tag def get_current_time(format_string): return datetime.datetime.now().strftime(format_string)
{% get_current_time "%Y-%m-%d %I:%M %p" as the_time %}
<p>The time is {{ the_time }}.</p>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python實現(xiàn)對文件中圖片生成帶標簽的txt文件方法
下面小編就為大家分享一篇python實現(xiàn)對文件中圖片生成帶標簽的txt文件方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python+PyQt5實現(xiàn)美劇爬蟲可視工具的方法
這篇文章主要介紹了Python+PyQt5實現(xiàn)美劇爬蟲可視工具的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
Python實現(xiàn)五子棋聯(lián)機對戰(zhàn)小游戲
本文主要介紹了通過Python實現(xiàn)簡單的支持聯(lián)機對戰(zhàn)的游戲——支持局域網聯(lián)機對戰(zhàn)的五子棋小游戲。廢話不多說,快來跟隨小編一起學習吧2021-12-12
Python生命游戲實現(xiàn)原理及過程解析(附源代碼)
這篇文章主要介紹了Python生命游戲實現(xiàn)原理及過程解析(附源代碼),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08
Python報錯TypeError: ‘NoneType‘ object is
在Python編程中,TypeError 是一個常見的錯誤,它表明代碼中存在類型不匹配的問題,TypeError: 'NoneType' object is not subscriptable 是一個具體的例子,本文將探討這個錯誤的原因,并提供幾種解決方案,需要的朋友可以參考下2024-10-10

