Python 使用定制Django templatetags保持干燥
我有一个现有的templatetag,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
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,需要导入哪些模块?我喜欢这种方法!你不需要导入任何其他内容。人力资源经理,也许我做错了。你能编辑你的答案并提供一个片段吗?人力资源经理,也许我做错了。你能编辑你的答案并提供一个片段吗?