2017-07-14 120 views
0

在Django項目中,我有一個迷你導航欄,這個導航欄在〜30%的模板中很常見。我決定採取不同的路線,而不是將其納入我的全球base.html在將一個Django模板導入到另一個Django模板時遇到NoReverseMatch

我第一次寫這個獨立的觀點:

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

這種模式有什麼問題,它有什麼解決方法?一個說明性的例子可以做到這一點。

+0

'include'不叫一個視圖,它包含另一個模板,你包含的兩個片段是不相關的 – Sayse

+0

不需要視圖在另一個模板中包含一個模板只是使用包含 –

+1

你做過的同樣的事情早些時候,做一個模板,幷包含在base.html – Exprator

回答

3

您應該編寫一個自定義模板標籤 - 具體地說,是一個用自定義上下文呈現模板的inclusion tag,而不是直接包含模板。您在該單獨視圖中放置的代碼將在該模板標記中。

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是傳遞給標籤的參數。