2016-06-08 21 views
1

Ich arbeite an meinem ersten Django-Projekt (abgesehen von ein paar Tutorials) und bleibe dabei, wie ich das erreichen kann. Der Einfachheit halber werde ich eine Excel-Analogie verwenden, um zu erklären, was ich zu tun versuche. Ich habe 7 Knöpfe über Reihe 1 (TOP-Modell). Wenn Sie auf eine dieser Schaltflächen klicken, wird eine Liste von 5 Elementen in Spalte A (SEITENMODELL) angezeigt, die alle entsprechende Elemente in den Zeilen 2-6 (BODY-Modell) enthalten. In der Ansicht kann ich das SIDE-Modell über den TOP-Modell-Primärschlüssel laden, kann aber nicht herausfinden, wie das BODY-Modell verbunden werden soll, da es vom SIDE-Modell abhängig ist.Wie lade ich mehrere Tabellen in eine Django View?

VIEW

def details(request, pk): 
    top = TOP.objects.filter().order_by('-modified_date') 
    middle= MIDDLE.objects.filter(TOP_id__pk=pk) 
    body = BODY.objects.filter(??????????) 
    return render(request, 'details.html', {'top': top, 'middle': middle, 
                 'body': body}) 

MODEL

class TOP(models.Model): 
    title = models.CharField(max_length=200) 

class MIDDLE(models.Model): 
    TOP= models.ForeignKey('mysite.TOP', related_name='middle') 
    title = models.CharField(max_length=200) 

class BODY(models.Model): 
    TOP= models.ForeignKey('mysite.TOP', related_name='indicators') 
    MIDDLE= models.ForeignKey('mysite.MIDDLE', related_name='indicators') 
    title = models.CharField(max_length=200) 

TEMPLATE

{% block content %} 
<div> 

    <div class="TOP-container"> 
     {% for tops in top %} 
      <div class="tops"><a href="{% url 'details' pk=tops.pk %}">{{ tops.title }}</a></div> 
     {% endfor %} 
    </div> 

    {% for middles in middle %} 
     <div class="middle-container"> 
      <div class="middles">{{ middles.title }}</div> 
      {% for bodys in body %} 
       <div class="bodys">{{ body.title }}</div> 
      {% endfor %} 
     </div> 
    {% endfor %} 

</div> 
{% endblock %} 

Antwort

1

Sie müssen die mittleren und Körper-Objekte zuzugreifen, den Fremdschlüssel bezogenen Namen.

Wenn ich Ihre Frage richtig verstanden:

  • Sie wollen nur MIDDLE (SIDE) Elemente mit dem ausgewählten TOP Element zugeordnet angezeigt werden soll.
  • Sie wollen nur BODY Elemente mit den angezeigten MIDDLE Elemente

Um dies zu erreichen Sie müssen im Zusammenhang angezeigt werden zu: nur

  1. Behalte dem TOP Element ausgewählt ist
  2. Schleife durch die MIDDLE Objekt mit einem Fremdschlüssel, der darauf zeigt TOP Objekt
Daher 10

, wird Ihre Schleife wie folgt aussehen:

{% for middle in selected_top.middle.all %} 
    <div class="middle-container"> 
     <div class="middles">{{ middle.title }}</div> 
     {% for body in middle.indicators.all %} 
      <div class="bodys">{{ body.title }}</div> 
     {% endfor %} 
    </div> 
{% endfor %} 

Beachten Sie die Vorlage Syntax verwendet, um den Fremdschlüssel zugreifen, indem seine related_name:

<object>.<related_name>.all 

Ein paar andere Hinweise:

  • Der Standard für die Verwendung eines Pluralvariablennamens zur Darstellung einer Gruppe von Objekten und eines Singularnamens zur Darstellung eines einzelnen Elements in der Gruppe; Sie tat das Gegenteil
  • Sie die Verwendung von MIDDLE und TOP
  • Mischen Sie nur den Satz von TOP Objekte der Ansicht
+0

Das ziemlich schmerzlos passieren müssen war und macht durchaus Sinn, danke! Ich habe auch die Verwendung von single/plural Variablennamen korrigiert, die jetzt definitiv besser liest. Ich habe das Django Girls Tutorial-Projekt, das ich zuvor fertiggestellt habe, benutzt und sie haben sie umgedreht, also danke, dass du darauf hinweist. – pheeper