2013-11-09 49 views
0

我剛開始使用自定義模板標記。無法獲取自定義模板標記

我有下面的代碼在我forum_tags.py定製tempates模塊:

from datetime import datetime, timedelta 
from django import template 
from django.utils.timesince import timesince 

register = template.Library() 

@register.filter 
def time_until(value): 
    now = datetime.now() 
    try: 
     difference = value - now 
    except: 
     return value 

    if difference <= timedelta(minutes=1): 
     return 'just now' 
    return '%(time)s ago' % {'time': timesince(value).split(', ')[0]} 

的代碼必須採取由timesince模板標籤返回的字符串,並從中只返回第一個值(由splited「」)。

在我html文件我用它像這樣:

{% load forum_tags %} 
<div class="started"> 
    <p>{{ obj.pub_date|timesince:forum_time|time_until }}</p> 
</div> 

但我仍然得到整個字符串。 有什麼問題?

+0

你知道內置'timeuntil'過濾器,對吧? https://docs.djangoproject.com/en/dev/ref/templates/builtins/#timeuntil你的用例看起來有點奇怪,所以我不知道它是否會完全按照你的意願去做。 –

+1

我認爲timesince給出一個字符串,所以你不能減去一個日期時間對象。 – Jingo

+0

@Jingo是的,我知道。我只是想通過逗號分割字符串,並只獲得第一個值。 – 9Algorithm

回答

1

基於更新問題陳述:

所有我想要的是讓「timesince」函數的輸出(串),由逗號分割字符串,只有第一個值傳遞給模板。例如。 timesince返回「1天19小時」,我只想得到「1天」。

我認爲最好的方法是將Python中內置的split作爲過濾器。一個簡單的實現是:

@register_filter 
def split(value, sep=None): 
    return value.split(sep) 

擴展以適應自定義過濾器的文檔建議:

過濾器函數應該總有返回值。他們不應該提出例外。他們應該默默地失敗。如果出現錯誤,他們應該返回原始輸入或空字符串 - 無論哪個更有意義。

@register_filter 
def split(value, sep=None): 
    try: 
     return value.split(sep) 
    except: 
     return value 

我不喜歡寫一個毯子except到任何代碼,但你無法控制value可能是什麼(你希望它是當你正確地調用它只是什麼),並且是唯一的確保它靜靜地失敗。

然後使用模板中現有的first過濾器。

{% load forum_tags %} 
<div class="started"> 
    <p>{{ obj.pub_date|timesince:forum_time|split:","|first }}</p> 
</div>