不過因為功能需求,不一定官方提供的功能,都能滿足系統的需求。因此,我覺得非常方便又有彈性的地方在於,Django能夠設計自己Filter或Tags。
在設計系統架構時,可以把這些當作元件,不但可以REUSE,在維護上也方便。
由於我還在使用Python2.6 Django1.3,所以僅供參考,也為自己學習Python筆記一下。
第一步驟
建立一個名稱為templatetags的目錄
這目錄和models.py、views.py 等等是同一層 (總之,依附在這個APP裡面)
P.S. 在templatetags裡面放置__init__.py檔案,確保這層目錄是使用Python package來運作。
第二步驟
在templatetags裡面建立你的module
取module file檔案名稱的時候記得別取跟你APP一樣(可能會錯誤)
P.S. 建議取的方式為<app_name>_tags.py (統一設計邏輯)
第三步驟
在Templates上方,load 進你的 tags or filters
{% load practice_tags %}
文件上說明 :
{% load %} statement will load tags/filters for the given Python module name,
not the name of the app.
Filter and Tags 設計
一、Filter的設計 : 參數的傳入,最少一個,最多兩個。
Views.py
from django import template
register = template.Library()
@ragister.filter
def hieght(name , arg):
height = 160
if name == 'small':
height = height
else:
height = height + int(arg)
return height
Templates
{% load practice_tags %}
{{ name|hieght:"10" }}
Django 使用Function name當作filter name
P.S. 可以使用@register.filter(name='return_hieght') 註冊filter的名稱
{{ name|return_hieght:"10" }}
二、Tags的設計
1. tag :可以動態抓取template variable
parser : is the template parser object
Views.py
@register.tag(name="upper")
def do_upper(parser, token):
nodelist = parser.parse(('endupper',))
parser.delete_first_token()
return UpperNode(nodelist)
class UpperNode(template.Node):
def __init__(self, nodelist):
self.nodelist = nodelist
def render(self, context):
output = self.nodelist.render(context)
return output.upper()
Templates
{% upper %}This will appear in uppercase, {{ your_name }}.{% endupper %}
2. Simple tags : 接受任意多個參數,封裝在render function,然後在register到Template裡面。
Views.py
@register.simple_tag
def current_time(format_string):
return datetime.datetime.now().strftime(format_string)
Templates
{% current_time "%Y-%m-%d %I:%M %p" %}
備註:因為filter and tag 比較難debug,建議加上log。
參考來源:
https://docs.djangoproject.com/en/1.7/howto/custom-template-tags/
Built-in template tags and filters
沒有留言:
張貼留言