Privacy Policy
Snippets index

  Show ImageField thumbnails in Django Admin

file model.py

class MyModel(BaseModel):

    my_image = models.ImageField(null=True, blank=True, upload_to=...)

file admin.py

from django.contrib import admin
from imagekit.admin import AdminThumbnail
from .widgets import AdminImageWidget

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):

    # (1) Show thumbnail in changelist
    list_display = [..., 'my_image_thumbnail', ]
    my_image_thumbnail = AdminThumbnail(image_field='my_image')
    my_image_thumbnail.short_description = 'Thumbnail'

    # (2) Show thumbnail in changeview
    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name == 'my_image':
            # remove request to avoid "__init__() got an unexpected keyword argument 'request'" error
            kwargs.pop("request", None)
            kwargs['widget'] = AdminImageWidget
            return db_field.formfield(**kwargs)
        return super(MyModelAdmin,self).formfield_for_dbfield(db_field, **kwargs)

where AdminImageWidget is defined in file widgets.py:

from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin.widgets import AdminFileWidget


# http://www.psychicorigami.com/2009/06/20/django-simple-admin-imagefield-thumbnail/
class AdminImageWidget(AdminFileWidget):
    def render(self, name, value, attrs=None):
        output = []
        if value and getattr(value, "url", None):
            image_url = value.url
            file_name=str(value)
            output.append(u' <a href="%s" target="_blank"><img src="%s" alt="%s" /></a> %s ' % \
                (image_url, image_url, file_name, _('Change:')))
        output.append(super(AdminFileWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))