2016-12-09 11 views
1

Wenn ich Template-Variablen zum Ersetzen von Feldern aus meinem Projektmodell verwenden, so wie {{ project.title }} und {{ project.featured_image }}. Es wirkt wie ein Zauber.Ich kann {{Variablen}} für ein Modell verwenden, aber kein anderes?

Aber wenn ich versuche, etwas ähnliches in der gleichen HTML-Vorlage für das MapData-Modell {{ mapdata.location }} zu tun, wird es nicht durch irgendeinen Wert ersetzt, es ist einfach leer.

Warum ist das? Ich habe das Modell gelesen und in den Django Docs Abfragen durchgeführt. Benötigt es eine andere Technik, weil es ein ForeignKey ist? Natürlich fehlt mir hier etwas Grundlegendes, aber ich kann nicht herausfinden, was es alleine ist.

Kann mir jemand erklären, wie man auf das MapData-Modell "zugreift"? Und ich habe ein paar Projekte über den Admin mit korrekten Daten in jedem Feld in diesem models.py hinzugefügt.

>>> from projects.models import * 
>>> MapData.objects.all() 
<QuerySet [<MapData: MapData object>, <MapData: MapData object>]> 

>>> from projects.models import * 
>>> Project.objects.all() 
<QuerySet [<Project: Some title 1>, <Project: Some title 2>]> 

Wo ist das Modell:

from django.db import models 


class Project(models.Model): 
    title = models.CharField(max_length=200) 
    text = models.TextField() 
    date = models.DateField() 
    featured_image = models.ImageField(
     upload_to='projects/featured', default=False) 

    def __str__(self): 
     return self.title 


class ProjectImage(models.Model): 
    project = models.ForeignKey(Project, related_name='images') 
    image = models.ImageField(upload_to='projects') 


class MapData(models.Model): 
    project = models.ForeignKey(Project) 
    longitude = models.DecimalField(
     max_digits=10, decimal_places=8, default=False) 
    latitude = models.DecimalField(
     max_digits=10, decimal_places=8, default=False) 
    location = models.CharField(max_length=200, blank=True) 

Hier ist die Prüfung HTML-Vorlage, project_detail.html:

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <title>Project {{ project.title }}</title> 
    </head> 
    <body> 
    <div class="project_featured"> 
     <img src="{{ MEDIA_URL }}/media/{{ project.featured_image }}" alt="{{ project.title }}" /> 
    </div> 
    <div class="project_content"> 
     <h4>{{ project.title }}</h4> 
     <p>{{ project.text|linebreaks }}</p> 
     <h5>{{ project.get_typology_display }}</h5> 
     <h5>Location: {{ mapdata.location }}</h5> 
    </div> 
    </body> 
</html> 

Antwort

1

nehme ich an Sie versuchen, die Kartendaten für ein bestimmtes Projekt zu erhalten , so müssen Sie die Beziehung

{% for map_data in project.mapdata_set.all %} 
{{ map_data.location }} 
{% endfor %} 
folgen

Die Variablenvariablen {{ }} beziehen sich auf eine Variable im aktuellen Kontext, die nicht mapdata ist. Welche Daten würden Sie von sich aus erwarten? Durch das Bereitstellen einer Schleife über alle Kartendaten, die sich auf das Projekt beziehen, fügen Sie map_data, das iterierte Objekt, in den aktuellen Bereichskontext ein

+0

DANKE, es hat funktioniert. Nun, das könnte sein, wenn ich verwirrt werde. Da ich in der project_detail.html und nicht in der project_list.html bin, dachte ich, dass das Kontext genug ist, denke ich. Und daher keine Notwendigkeit für eine Schleife. – itchangry

+0

@itchangry - Alles hängt von der Beziehung zwischen Projekt und map_data ab. Sie müssen es irgendwie sagen, welche map_data Sie eigentlich suchen. Ich stelle mir vor, dass man mit den Lauten eine 'DetailView' mit dem' context_object_name' als 'project' definiert, was' projekt' zu den Kontextdaten hinzufügt und warum man diese Variable – Sayse

+1

verwenden darf Sie sind genau richtig! Ich muss über Kontext und Beziehung nachlesen. – itchangry

Verwandte Themen