Представление списка изменений в 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() не может найти мои файлы.
Мне удается отображать изображения на страницах администратора, хотя:
if instead of providing a path such as
self.photo.pathtosrcinformat_html(), I provide a web url, likehttp://imageserver.com/images/12345, or;through overriding methods like
change_listorchangelist_viewand then inserting a{% static %}tag in the corresponding template, providing the image's absolute path withobject.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'.
Это занимает целую вечность, поэтому заранее огромное спасибо за любую оказанную помощь.