【问题标题】:Keeping DRY with custom Django templatetags使用自定义 Django 模板标签保持 DRY
【发布时间】:2011-04-15 20:12:22
【问题描述】:

我有一个现有的模板标签,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)

我想对模板进行抽象。首先想到的是将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)

或者有更好的解决方案吗?

【问题讨论】:

    标签: python django dry django-templates


    【解决方案1】:

    Django 是 Python,而不是 Ruby。您不能仅通过指定函数名称来调用函数:您需要使用调用括号。并且 Python 不会自动返回函数中最后一个表达式的值:您需要使用 return 语句。

    所以,这应该可行:

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

    另外,请注意我使用了装饰器语法来注册标签。

    【讨论】:

    • 需要导入哪些模块才能使用装饰器?我喜欢这种方法!
    • 您不需要导入任何其他内容。
    【解决方案2】:

    遵循@Daniel 的建议后,您可以这样做以避免defs(干!):

    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)
    

    【讨论】:

    • Hrm,也许我做错了。你能编辑你的答案并提供一个sn-p吗?
    猜你喜欢
    • 2021-07-13
    • 2014-03-08
    • 2015-01-20
    • 2012-03-15
    • 1970-01-01
    • 2015-12-17
    • 2015-09-18
    • 2011-03-31
    相关资源
    最近更新 更多