在Django项目中,我有一个迷你导航栏,在我的模板的约30%中很常见。我决定采取不同的方式,而不是将其包括在我的全球base.html
中。
我首先为此写了一个单独的视图:
from django.template.loader import render_to_string
def navbar(origin=None):
if origin == '1':
locations = get_approved_loc(withscores=True)
else:
locations = get_approved_loc()
obj_count = get_all_obj_count()
return render_to_string("mini_navbar.html",{'top_3_locs':locations[:3],\
'other_cities':len(locations[3:]),'obj_count':obj_count})
我接下来将它添加到需要进入的模板中:
{% include "mini_navbar.html" with origin='1' %}
运行此代码时,出现NoReverseMatch
错误。看来函数navbar
从未运行过。因此,它所发送的上下文变量(例如top_3_locs
或other_cities
等)从不填充。因此NoReverseMatch
。
这种模式有什么问题,以及它的修复方法是什么?一个说明性的例子可以解决问题。
答案 0 :(得分:3)
不应直接包含模板,而应编写自定义模板标记 - 特别是使用自定义上下文呈现模板的inclusion tag。您放在该单独视图中的代码将改为该模板标记。
答案 1 :(得分:0)
这是丹尼尔建议的一个说明性例子:
我创建了一个“inclusion”模板标签,如下所示:
from django import template
from redis_modules import get_approved_loc, get_all_obj_coun
register = template.Library()
@register.inclusion_tag(file_name='mini_navbar.html')
def mini_navbar(origin=None):
locations = get_approved_loc(withscores=True)
obj_count = get_all_obj_count()
return {'top_3_locs':locations[:3],'origin':origin,'other_cities':len(locations[3:]),'obj_count':obj_count}
接下来,我将其包含在相关的模板中,如下所示:
{% load get_mini_navbar %} <!-- name of the module -->
最后,我在模板中调用了它:
{% mini_navbar origin %}
origin
是传递给标记的参数。