2017-01-02 11 views
0

Ich habe gerade mit Django angefangen und versuche herauszufinden, wie das Zeug funktioniert. Ich stehe mit dem folgenden Problem fest.Django Python - wähle Spalte aus verwandtem Objekt in einer Vorlage

Ich habe einen models.py:

class Station(models.Model): 
    code = models.CharField(max_length=10, default='') 
    land = models.CharField(max_length=10, default='') 

    def __str__(self): 
     return self.code 

class Naam(models.Model): 
    kort = models.CharField(max_length=255, default='') 
    middel = models.CharField(max_length=255, default='') 
    lang = models.CharField(max_length=255, default='') 
    station = models.ForeignKey(Station, default='', on_delete=models.CASCADE, related_name='namen') 

    def __str__(self): 
     return self.lang 

Ich habe einen view.py:

def index(request): 
    all_stations = Station.objects.all() 
    return render(request,'stations/index.html', {'all_stations' : all_stations}) 


def detail(request, station_id): 
    try: 
     station = Station.objects.get(id=station_id) 
     stationnamen = station.namen.values() 
    except Station.DoesNotExist: 
     raise Http404("station does not exist") 
    return render(request, 'stations/detail.html', {'stationnamen' : stationnamen.values()}) 

In einer Vorlage html einige Details über eine Station (kort zu zeigen, ich versuche, Middel, Lang) Namen. Ist es möglich, ein bestimmtes Feld in der queryset zu zeigen, wie:

<h1>{{ stationnamen.kort }}</h1> 

In der Shell ich in der Lage bin, dies zu tun, wie folgt:

station1.namen.values('kort') 

Wie diese Arbeit in Template-Dateien?

Danke!

Antwort

0

values gibt eine QuerySet, die Wörterbücher https://docs.djangoproject.com/en/1.10/ref/models/querysets/#values

Sie müssen Schleife auf dieser QuerySet kehrt dict-Objekt zu erhalten. Dieses dict-Objekt enthält alle Felder.

station1.namen.values('kort')

Hier filtern Sie einfach das Feld kort. Ihr Abfrage-Set enthält dict mit nur kort Informationen.

Die values ​​() -Methode verwendet optionale Positionsargumente * Felder, die Feldnamen angeben, auf die SELECT beschränkt werden soll. Wenn Sie die Felder angeben, enthält jedes Wörterbuch nur die Feldschlüssel/Werte für die von Ihnen angegebenen Felder. Wenn Sie die Felder nicht angeben, enthält jedes Wörterbuch einen Schlüssel und einen Wert für jedes Feld in der Datenbanktabelle.

{% for namen_dict in stationnamen %} 
    # used namen_dict to display what you want. It's a dict. 
{% endfor %} 

Wie sagen Daniel Roseman, die Sie nicht values() benötigen Informationen über Naam Objekt zuzugreifen. Warum benutzen Sie values()?

Endlösung Basis nach Bedarf (siehe Kommentare)

Ansicht.py

def index(request): 
    all_stations = Station.objects.all() 
    return render(request,'stations/index.html', {'all_stations' : all_stations}) 


def detail(request, station_id): 
    try: 
     stationnamen = Station.objects.get(id=station_id).namen.all() # Don't need station object. 
    except Station.DoesNotExist: 
     raise Http404("station does not exist") 
    return render(request, 'stations/detail.html', {'stationnamen' : stationnamen}) 

Vorlage

{% for naam in stationnamen %} 
    <h1>{{ naam.koort }}</h1> 
    <h1>{{ naam.middel }}</h1> 
    <h1>{{ naam.lang }}</h1> 
    <h1>{{ naam.station }}</h1> 
{% endfor %} 

Lösung, wenn Sie wie Sie außer

def detail(request, station_id): 
    try: 
     naam = Naam.objects.get(station_id=station_id) # Only one Naam object. 
    except Station.DoesNotExist: 
     raise Http404("station does not exist") 
    return render(request, 'stations/detail.html', {'naam' : naam}) 

Vorlage ein Eins-zu-Eins-Beziehung haben (müssen nicht für Schleife)

<h1>{{ naam.koort }}</h1> 
<h1>{{ naam.middel }}</h1> 
<h1>{{ naam.lang }}</h1> 
<h1>{{ naam.station }}</h1> 

Ich hoffe, es hilft.

+0

Danke für die Antwort! Ich wollte nur den Wert 'kort', 'middel' in der Vorlage. Wie:

{{}} station.namen.kort

{{}} station.namen.middel

{{}} station.namen.lang

Warum ist eine FOR-Anweisung erforderlich? Und was, wenn es nur eine Eins-zu-Eins-Beziehung gibt? In diesem Fall erscheint mir ein FOR ein bisschen komisch. –

+0

Sie verwenden ForeignKey. So kann es viele zu eins sein. Wenn Sie eine Eins-zu-Eins-Beziehung wünschen, müssen Sie https://docs.djangoproject.com/en/1.10/topics/db/examples/one_to_one/ verwenden. Sie können das gesamte Feld anzeigen. Also in deinem Fall, Werte, es ist nicht gut. Sie müssen Daniel Lösung verwenden. Abfragegruppe des Naam-Objekts abrufen – Wilfried

+0

Große Antwort! Macht jetzt Sinn. –

0

Ihr Problem ist in Ihrer Verwendung von values. Dies ist für den seltenen Fall, dass Sie Wörterbücher erhalten möchten, aber meistens möchten Sie nur die tatsächliche Modellinstanz übergeben.

station = Station.objects.get(id=station_id) 
    stationnamed = station.namen.all() 
    .... 
    return render(request, 'stations/detail.html', {'stationnamen' : stationnamen}) 

Die andere Sache zu verstehen ist, dass es viele Instanzen von Naam für jede Station, so müssen Sie durch sie in Ihrer Vorlage iterieren.

{% for naam in stationnamen %} 
    {{ naam.koort }} 
{% endfor %} 
Verwandte Themen