Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用定制Django templatetags保持干燥_Python_Django_Dry_Django Templates - Fatal编程技术网

Python 使用定制Django templatetags保持干燥

Python 使用定制Django templatetags保持干燥,python,django,dry,django-templates,Python,Django,Dry,Django Templates,我有一个现有的templatetag,show\u next\u 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

我有一个现有的templatetag,
show\u next\u 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
,然后添加两个新函数<代码>显示下一个事件和
显示下一个事件徽章
。我希望我能做如下的事情,但它不能按原样工作:

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()

另外,请注意,我使用了decorator语法来注册标记。

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

因此,这应该是可行的:

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

另外,请注意,我使用了decorator语法来注册标记。

遵循@Daniel建议后,您可以这样做以避免出现
def
s(DRY!):

编辑:

是这样的:

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)

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

编辑:

是这样的:

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)

使用decorator需要导入哪些模块?我喜欢这种方法!您不需要导入任何其他内容。要使用decorator,需要导入哪些模块?我喜欢这种方法!你不需要导入任何其他内容。人力资源经理,也许我做错了。你能编辑你的答案并提供一个片段吗?人力资源经理,也许我做错了。你能编辑你的答案并提供一个片段吗?