Django: отображение изображения в интерфейсе администратора
Я определил модель, содержащую ссылку на изображение. Есть ли способ отобразить изображение в списке элементов модели? Моя модель выглядит так:
class Article(models.Model):
url = models.CharField(max_length = 200, unique = True)
title = models.CharField(max_length = 500)
img = models.CharField(max_length = 100) # Contains path to image
def __unicode__(self):
return u"%s" %title
Есть ли способ показать изображение вместе с заголовком?
Ответы
Ответ 1
Вы можете создать метод экземпляра модели с другим именем, разрешить HTML-теги для его вывода и добавить этот метод в качестве поля списка. Вот пример:
Сначала добавьте новый метод, возвращающий HTML для включения изображения:
class Article(models.Model):
...
def admin_image(self):
return '<img src="%s"/>' % self.img
admin_image.allow_tags = True
Затем добавьте этот метод в список:
class ArticleAdmin(admin.ModelAdmin):
...
list_display = ('url', 'title', 'admin_image')
Ответ 2
def image_tag(self, obj):
return u'<img src="%s" />' % obj.image
image_tag.short_description = 'Image'
image_tag.allow_tags = True
и в вашем admin.py добавьте:
readonly_fields = ('image_tag',)
Ответ 3
ОБНОВЛЕНИЕ django 2.0.6
Я решал эту проблему в последней версии django 2.0.6. Я хотел добиться того, чтобы изображение было миниатюрным, а некоторые подробности отображались в списке в django-admin.
На картинке ниже показан мой список администратора по умолчанию.
![This is my default admin view]()
Это мой models.py:
from django.db import models
from django.utils.safestring import mark_safe
# Create your models here.
class Product(models.Model):
title = models.CharField(max_length=120)
description = models.TextField()
price = models.DecimalField(decimal_places = 2, max_digits = 20, default = 00.00)
image = models.ImageField(upload_to=change_image_name, null=True, blank=True)
def image_tag(self):
if self.image:
return mark_safe('<img src="%s" style="width: 45px; height:45px;" />' % self.image.url)
else:
return 'No Image Found'
image_tag.short_description = 'Image'
def __str__(self):
return self.title
Обратите внимание, что мне пришлось использовать mark_safe() в строке изображения, иначе вы получит экранированный HTML-код вместо миниатюры в django-admin
Наконец-то это мой admin.py
from django.contrib import admin
from .models import Product
# Register your models here.
class ProductAdmin(admin.ModelAdmin):
list_display = ('title', 'description', 'price', 'image_tag')
admin.site.register(Product, ProductAdmin)
Здесь мы должны зарегистрировать класс ProductAdmin, я не знал, что и это не сработало.
Это результат:
![enter image description here]()
Ответ 4
вы также можете добавить изображение непосредственно в admin
class ArticleAdmin(admin.ModelAdmin):
def admin_image(self, obj):
return '<img src="%s"/>' % obj.img
admin_image.allow_tags = True
list_display = ('url', 'title', 'admin_image')
Ответ 5
(Я использую Django 1.5)
В дополнение к следующим шагам в принятом ответе, я также должен был пометить тег изображения как "безопасный"
Чтобы сделать это, оберните возвращаемое значение с помощью метода mark_safe пакета django.utils.safestring.
пример кода: fooobar.com/questions/213496/...
django docs: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#filters-and-auto-escaping
Ответ 6
Вы можете перезаписать django admin view для своей модели. Подробнее см. http://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-admin-templates.
Вкратце вам нужно создать шаблон: templates/admin/your_app/article/change_form.html
И добавьте html для отображения изображения.
Ответ 7
http://www.djangosnippets.org/snippets/239/
там, что, плюс, если вы используете 1.2, вы можете комбинировать вышеуказанные поля только для чтения.