2011-04-15 25 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