Проблема Django/html с отображением/ссылкой изображения
Я делаю сайт с помощью django. Одна из моих моделей содержит ImageField. Файлы сохраняются в main_dir/media/images. Я хотел бы отображать определенные изображения в шаблонах, но не могу этого добиться. Вместо фотографии я вижу только иконку изображения по умолчанию, что означает (я предполагаю), что изображение не найдено
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
модели
class Gallery(models.Model):
name = models.CharField(max_length=200)
author = models.ForeignKey(User, on_delete=models.CASCADE, default=None, null=True, blank=True)
date_posted = models.DateTimeField(auto_now_add = True)
def __str__(self):
return self.name
class Photo(models.Model):
gallery = models.ForeignKey(Gallery, on_delete=models.CASCADE, default=None, related_name='photos')
name = models.CharField(max_length=200)
description = models.TextField(blank=False)
image = models.ImageField(blank=True, upload_to='images')
просмотров
def gallery(request, pk):
gallery_object = Gallery.objects.get(id=pk)
context = {'gallery':gallery_object}
return render(request, 'Gallery/gallery.html', context)
html
<!DOCTYPE html>
{% extends 'base.html' %}
{% block content %}
<h1>Gallery: {{ gallery.name }}</h1>
{% for photo in gallery.photos.all %}
<img src="{{photo.image.url}}">
<a>{{photo.image.url}}</a> #it's here only to check if path is correct
{% endfor %}
<a href="{% url 'home' %}">Go back to home page</a>
{% endblock content %}
что нужно изменить, чтобы изображение отображалось правильно?
для получения нескольких объектов вам нужно изменить .get на .filter с тем же условием потому что get вернет только один объект, и вы не сможете сделать цикл for в шаблоне
Здесь есть несколько неправильных моментов. Во-первых, если вы хотите вернуть несколько изображений, то вам нужно использовать .filter() вместо .get(), а если вы используете .get() вместо фильтра, то вам не нужно выполнять цикл, так как он дает один объект. А изображение хранится в модели Photos и для этого вам придется вызывать ее вместо gallery.
Вот как это можно исправить: Для одного объекта: функция представления: def gallery(request, pk): gallery_object = Photos.objects.get(id=pk)
context = {'photo': photo_object}
return render(request, 'Gallery/gallery.html', context)
HTML шаблон:
<!DOCTYPE html>
{% extends 'base.html' %}
{% block content %}
<h1>Gallery: {{ photo.name }}</h1>
<img src="{{photo.image.url}}">
<a>{{photo.image.url}}</a> #it's here only to check if path is correct
<a href="{% url 'home' %}">Go back to home page</a>
{% endblock content %}
Для возврата нескольких объектов:
просматривает функцию:
def gallery(request, pk):
gallery_object = Photos.objects.filter(#your query)
context = {'photos': photo_object}
return render(request, 'Gallery/gallery.html', context)
HTML:
<!DOCTYPE html>
{% extends 'base.html' %}
{% block content %}
{% for photo in photos %}
<h1>Gallery: {{ photo.name }}</h1>
<img src="{{photo.image.url}}">
<a>{{photo.image.url}}</a> #it's here only to check if path is correct
{% endfor %}
<a href="{% url 'home' %}">Go back to home page</a>
{% endblock content %}
Наконец, я нашел проблему. Я забыл добавить
urlpatterns+=static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
в мой файл urls.py. lmao