Проблема: Я не могу заставить изображения появляться в моем шаблоне plant_detail.html. Я думаю, что неправильно вызываю переменные, но не знаю, что изменить.
Контекст:
Я создал модель ЗаводИзображение, которая позволяет мне связать несколько изображений с моей моделью Растение.
Затем я создал представление РастениеДетальВид на основе классов, чтобы связать вместе две модели, ЗаводИзображение и Растение.
Однако теперь, когда я пытаюсь отобразить эти изображения в шаблоне plant_detail.html, ничего не появляется. Как я могу сделать так, чтобы изображения появлялись в моем шаблоне?
Я пробовал читать документацию Django, читать статьи и смотреть видео на YouTube, но я не уверен, что мне не хватает или что нужно редактировать.
Мои файлы:
растения/модели.py
class Plant(models.Model):
name = models.CharField(max_length=120)
slug = models.SlugField(null=False, unique=True)
description = models.TextField()
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("plant_detail", kwargs = {"slug": self.slug})
class PlantImage(models.Model):
plant = models.ForeignKey(Plant, default=None, on_delete=models.CASCADE)
images = models.ImageField(upload_to = 'images/')
def __str__(self):
return self.plant.name
растения/views.py
def plant_index(request):
plant_objects = Plant.objects.all()
context = {'plant_objects': plant_objects}
return render(request, 'plants/plant_index.html', context)
class PlantDetailView(DetailView):
model = Plant
template_name = 'plants/plant_detail.html'
slug = 'slug'
def get_context_data(self, **kwargs):
context = super(PlantDetailView, self).get_context_data(**kwargs)
context['plant_images'] = PlantImage.objects.all()
return context
plant_detail = PlantDetailView.as_view()
растения /urls.py
from django.urls import path
from .views import plant_index, plant_detail
app_name = 'plants'
urlpatterns = [
# ex: /plants/
path('', plant_index, name='plant_index'),
# ex: /plants/pothos/
path("<slug:slug>", plant_detail, name = "plant_detail"),
]
растения/plant_detail.html
{% block content %}
<body>
<h1> {{ plant.name }} </h1>
<br>
<p> <b>Latin Name: </b>{{ plant.latin_name }} </p>
<br>
<p><b>Description: </b></p>Dj
<p> {{ plant.description }} </p>
<br>
<br>
<p>Images:</p>
<br>
{% for image in plant_images %}
<p><img src = "{{ plant.images }}" width = "300px"></p>
{% endfor %}
</body>
{% endblock content %}
settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = str(BASE_DIR.joinpath('mediafiles'))
Код «PlantImage.objects.all()» получает не только конкретное изображение, связанное с растением, но и другие изображения.
поэтому, если вы хотите получить доступ к PlantImage из Plant, вам нужно написать related_name.
https://docs.djangoproject.com/en/4.0/ref/models/fields/#django.db.models.ForeignKey.related_name
class PlantImage(models.Model):
plant = models.ForeignKey(Plant, default=None, on_delete=models.CASCADE, related_name = "plant_images")
...
ImageField наследует FileField. Итак, вам нужно кое-что знать о функциях Filefield.
https://docs.djangoproject.com/en/4.0/ref/models/fields/#filefield-and-fieldfile
если вы хотите показывать изображения, добавьте '.url' вот так.
{% for image in plant.plant_images.all %}
<p><img src = "{{ image.images.url }}" width = "300px"></p>
{% endfor %}
Спасибо, @сеомин-кан! Я никогда не замечал поле related_name в документации, это очень полезно. Теперь мой шаблон отображает значки сломанных изображений, что означает, что теперь я правильно вызываю имена переменных благодаря вашей помощи. Я углублюсь в это немного больше, но я думаю, что мой следующий шаг будет заключаться в том, чтобы убедиться, что мои файлы изображений правильно структурированы, и, возможно, это то, что вызывает поврежденное изображение.