将一个Django模板导入另一个模板时遇到NoReverseMatch

时间:2017-07-14 08:56:39

标签: django django-templates

在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_locsother_cities等)从不填充。因此NoReverseMatch

这种模式有什么问题,以及它的修复方法是什么?一个说明性的例子可以解决问题。

2 个答案:

答案 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是传递给标记的参数。