Подтвердить что ты не робот

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

Есть ли способ показать изображение вместе с заголовком?

4b9b3361

Ответ 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

Ответ 7

http://www.djangosnippets.org/snippets/239/

там, что, плюс, если вы используете 1.2, вы можете комбинировать вышеуказанные поля только для чтения.