2016-07-21 12 views
1

Ich versuche herauszufinden, ob es eine Möglichkeit gibt, eine Teilansicht in eine Ansicht zu erweitern, die base.html bereits erweitert. HierErweitern einer Vorlage, die bereits in Django erweitert wurde

ist ein Beispiel dafür, was ich versuche zu tun:

my-template.html

{% extends 'base.html '%} 

<div class="row"> 
    <div class="col-xs-12"> 
    <ul class="nav nav-tabs"> 
     <li role="presentation" class="active"><a href="#">Tab1</a></li> 
     <li role="presentation"><a href="#">Tab2</a></li> 
    </ul> 
    </div> 
</div> 

<div> 
{% block tab_content %} 
{% endblock %} 
</div> 

partial1.html

{% extends 'my-template.html' %} 

{% block tab_content %} 
<h1>I'm partial 1</h1> 
{% endblock %} 

Die my- template.html view hat eine URL, die wie folgt aufgebaut ist:

url(r'^my-template/(?P<id>[0-9]+)/$', views.my_template_view, name='my-template') 

Zusätzlich wird ein Kontext-Dict in die my_template_view übergeben, die die ID für die URL liefert.

Ich möchte das für den Benutzer auf eine Registerkarte klicken und für seine Teil entsprechenden wie so mit einer URL zu erbringenden:

url(r'^my-template/(?P<id>[0-9]+)/tab1/$', views.tab1_view, name='tab1-view') 

aber jetzt bin ich ein NoReverseMatch an/my- bekommen template/97/tab1/was ich annehme bedeutet, dass meine tab1_view nicht auf den gleichen Kontext wie die my_template_view zugreifen kann und somit die ID nicht die umgekehrte URL erstellen kann.

In template /partial1.html, error at line 0 
Reverse for 'tab1_view' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['/my-template/(?P<id>[0-9]+)/tab1/$'] 

Also, gibt es eine Möglichkeit für mich, zumindest entlang der Kontext weitergeben oder die ID so das funktioniert, oder bin ich über diese gehen in die völlig falsche Weg?

+0

Sie haben den Traceback oder den Ansichts-/Vorlagencode, der den Fehler verursacht, nicht angezeigt. – Alasdair

Antwort

2

Der typische Weg, dies zu lösen, ist die Verwendung des Template-Tags include, nicht durch Erweiterung mit einer neuen Vorlage.

Here is the Django doc describing this.

Sie können auch eine Variable verwenden, um eine dynamische Vorlage Namen zu definieren, basierend auf Logik in Ihrer Ansicht aufgenommen werden.

wenig mehr Klarheit hier:

können Sie haben auch die URL Route zu der gleichen Ansicht lenken und hat den „Tab“ gegebenenfalls als zweiten Parameter übergibt, wie so:

url(r'^my-template/(?P<id>[0-9]+)/(?P<tab_name>\w+)/$', views.my_template_view, name='my-template') 
url(r'^my-template/(?P<id>[0-9]+)/$', views.my_template_view, name='my-template') 

Und Ihre Ansicht würde in etwa so aussehen:

def my_template_view(request, id, tab_name=None): 
    if not tab_name: 
     tab_name = "tab1" 
    if tab_name == "tab1": 
     partial = "tab1.django.html" 
    elif tab_name == "tab2": 
     partial = "tab2.django.html" 
    return render("my-template.html", { 'partial': partial }) 

Und auf Ihrer Vorlage, die Sie würde:

{% include partial %} 

Da die enthaltene Vorlage denselben Kontext hat, haben Sie Zugriff auf alle Variablen, die auch im ursprünglichen Kontext verfügbar waren.

+0

Richtig ok, also habe ich das versucht, aber ich war mir nicht sicher, wie man verschiedene Ansichten in my-template.html einfügt, basierend auf welcher Registerkarte geklickt wurde? Hast du einen Anfang für diese Logik? – moku

+0

:) Überprüfen Sie meine letzte Änderung. Brauchst du ein bisschen mehr als das? – cardonator

+0

ok ich fühle mich wie ich bin fast da, aber wie bekommt my_template_view den tab_name beim Klick? – moku

Verwandte Themen