Представление списка изменений в Django Admin: отображение изображения из поля ImageField

Я пытаюсь отобразить изображение каждой модели в админке 'change list view' путем
. 1) определяю метод, который отображает изображение из ImageField;
2) вставляя его в list_display в admin.py.

На данный момент я просмотрел много вопросов и увидел много решений с использованием format_html. Вот что я придумал:

[models.py]

class MyClass(models.Model):
    ...
    def show_photo(self):
        return format_html(
            "<img src={}>",
            'self.photo.path'
        )

[admin.py]

class CustomClass(admin.ModelAdmin):
    ...
    list_display = ('name','email','show_photo')

Но, несмотря ни на что, я получаю от Chrome эту ошибку: Failed to load resource: the server responded with a status of 500 (Internal Server Error), и изображение, очевидно, сломано. Как будто format_html() не может найти мои файлы.

Мне удается отображать изображения на страницах администратора, хотя:

  1. if instead of providing a path such as self.photo.path to src in format_html(), I provide a web url, like http://imageserver.com/images/12345, or;

  2. through overriding methods like change_list or changelist_view and then inserting a {% static %} tag in the corresponding template, providing the image's absolute path with object.photo.path. Example:

[admin.py]

class...
...
    def change_view(self,request,object_id,form_url='',extra_context=None):
        p = MyClass.objects.get(id=object_id)
        extra_context = extra_context or {}
        extra_context['p'] = p.photo.path
        return super().change_view(request,object_id,form_url,extra_context=extra_context)

[change_form.html]
...
</ul>
  {% endif %}{% endif %}
  <img src="{% static p %}" heigh=200, width=200>
{% endblock %}
...

Обс..: Это должно быть object.photo.path, потому что object.photo.url не будет работать, так что есть вероятность, что вопрос здесь в хранении.

Подводя итог, я сделал так, что изображения появляются в "представлении изменений", и я могу отобразить изображение с веб-сайта. Теперь я хочу заставить каждую модель отображать свое изображение в "представлении списка изменений". Я пробовал переопределить changelist_view, например, так:

[admin.py]
class...
    def changelist_view(self,request,extra_context=None):
        objs = MyClass.objects.all()
        extra_context = extra_context or {}
        for i in objs:
            key = 'p'+str(i.id)
            extra_context[key] = i.photo.path
        return super().changelist_view(request,extra_context=extra_context)

но похоже, что это влияет только на один шаблон (change_list), и я не могу найти, где именно переопределить этот шаблон, чтобы получить то, что я хочу.

Кроме того, я также не могу указать абсолютный путь в <img src='absolute path'>, поскольку в этом случае Chrome выдает ошибку 'local source'.

Это занимает целую вечность, поэтому заранее огромное спасибо за любую оказанную помощь.

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