2011-04-15 48 views
0

我有現成的templatetag,show_next_event定製Django的乾爽templatetags

def show_next_event(): 
    try: 
     e = Event.objects.filter(published='1').order_by('date').filter(date__gte=datetime.date.today())[0] 
    except IndexError: 
     e = '' 
    return {'event': e} 
register.inclusion_tag('events/next_event.html')(show_next_event) 

我想抽象的模板。首先想到的是將show_next_event更改爲next_event,然後添加兩個新功能; show_next_eventshow_next_event_badge。我希望我能做類似以下的事情,但它不能按原樣工作:

def next_event(): 
    try: 
     e = Event.objects.filter(published='1').order_by('date').filter(date__gte=datetime.date.today())[0] 
    except IndexError: 
     e = '' 
    return {'event': e} 

def show_next_event(): 
    next_event 
register.inclusion_tag('events/next_event.html')(show_next_event) 


def show_next_event_badge(): 
    next_event 
register.inclusion_tag('events/next_event_badge.html')(show_next_event_badge) 

或者還有更好的解決方案嗎?

回答

4

Django是Python,而不是Ruby。您不能通過指定名稱來調用函數:您需要使用調用的括號。 Python不會自動返回函數中最後一個表達式的值:您需要使用return語句。

所以,這應該工作:

@register.inclusion_tag('events/next_event_badge.html') 
def show_next_event_badge(): 
    return next_event() 

另外請注意,我用的修飾語法註冊標記。

+0

需要導入哪些模塊才能使用裝飾器?我喜歡這種方式! – Flowpoke 2011-04-15 20:36:40

+0

您不需要導入任何其他內容。 – 2011-04-15 20:45:13

1

以下@Daniel建議後,你可以這樣做,以避免def S(DRY!):

show_next_event = next_event 
show_next_event_badge = next_event 

編輯:

這將是這樣的:

def next_event(): 
    try: 
     e = Event.objects.filter(published='1').order_by('date').filter(date__gte=datetime.date.today())[0] 
    except IndexError: 
     e = '' 
    return {'event': e} 

show_next_event = next_event 
show_next_event_badge = next_event 

register.inclusion_tag('events/next_event.html')(show_next_event) 
register.inclusion_tag('events/next_event_badge.html')(show_next_event_badge) 
+0

這是肉汁。愛它。 – Flowpoke 2011-04-15 21:01:28

+0

人,也許即時做錯了。你能編輯你的答案並提供一個片段嗎? – Flowpoke 2011-04-15 21:10:00