2016年3月1日 星期二

客製化 Django Filter and Tags

Django提供許多方法讓工程師在撰寫前端介面(Template)時,可以更快速及方便的寫出功能。Django已經提供出許多Filter and Tags功能,例如:時間格式轉換、資料格式轉換或基本運算。

不過因為功能需求,不一定官方提供的功能,都能滿足系統的需求。因此,我覺得非常方便又有彈性的地方在於,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

沒有留言:

張貼留言