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>
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
@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
verwenden darf Sie sind genau richtig! Ich muss über Kontext und Beziehung nachlesen. – itchangry