2017-07-14 3 views
0

In einem Django-Projekt habe ich eine Mini-Navbar, die in ~ 30% meiner Vorlagen üblich ist. Anstatt es in meine globale base.html aufzunehmen, entschied ich mich für eine andere Route.NoReverseMatch beim Importieren einer Django-Vorlage in eine andere gefunden

Ich schrieb zuerst eine separate Ansicht für diese:

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

ich es als nächstes in den Vorlagen hinzugefügt, um es in über sein musste:

{% include "mini_navbar.html" with origin='1' %} 

Wenn ich diesen Code ausführen, bekomme ich ein NoReverseMatch Fehler. Es scheint, dass die View-Funktion navbar niemals ausgeführt wird. Daher werden die Kontextvariablen, die gesendet wurden (z. B. top_3_locs oder other_cities usw.), nie ausgefüllt. Daher NoReverseMatch.

Was ist los mit diesem Muster, und was ist die Lösung dafür? Ein illustratives Beispiel würde den Trick machen.

+0

'include' ruft keine Ansicht auf, es enthält eine andere Vorlage, die zwei Snippets, die Sie eingefügt haben, sind nicht verwandt – Sayse

+0

keine Notwendigkeit der Ansicht, um eine Vorlage in einer anderen Vorlage zu verwenden, verwenden Sie einfach –

+1

das gleiche, was Sie getan haben früher, eine Vorlage machen und in base.html einbinden – Exprator

Antwort

3

Anstatt eine Vorlage direkt einzubeziehen, sollten Sie ein benutzerdefiniertes Vorlagen-Tag schreiben - speziell ein inclusion tag, das die Vorlage mit dem benutzerdefinierten Kontext rendert. Der Code, den Sie in diese separate Ansicht eingefügt haben, wird stattdessen in das Vorlagen-Tag eingefügt.

0

Hier ist ein anschauliches Beispiel für Daniels Vorschlag:

Ich habe einen 'inclusion' Template-Tag wie folgt:

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} 

Next I enthalten diese in den relevants Vorlagen wie so:

{% load get_mini_navbar %} <!-- name of the module --> 

Und schließlich nannte ich es so in der Vorlage:

{% mini_navbar origin %} 

Dabei ist origin der Parameter, der an das Tag übergeben wird.

Verwandte Themen