Проблема 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

Вернуться на верх