使用自定义Django templatetags保持DRY

|| 我有一个现有的模板标签
show_next_event
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)
我想抽象模板。首先想到的是将ѭ0更改为
next_event
,然后添加两个新功能。
show_next_event
show_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)
还是有更好的解决方案?     
已邀请:
Django是Python,而不是Ruby。您不能仅通过指定函数名称来调用它:您需要使用调用括号。而且Python不会自动返回函数中最后一个表达式的值:您需要使用
return
语句。 因此,这应该工作:
@register.inclusion_tag(\'events/next_event_badge.html\')
def show_next_event_badge():
    return next_event()
另外,请注意,我已经使用装饰器语法来注册标签。     
在遵循@Daniel的建议之后,您可以这样做以避免ѭ9(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)
    

要回复问题请先登录注册