Short snippet how-to build thumb for some field and show in change list.
I'm going to use sorl-thumbnail.
pip install sorl-thumbnail
Image thumbnail for admin change list
Mixin
from sorl.thumbnail import get_thumbnail
class ThumbMixin:
thumb_size = '100x100'
thumb_crop = 'center'
thumb_quality = 99
thumb_field = 'image'
thumb_keep_original = False
def thumb(self):
field = getattr(self, self.thumb_field, None)
if field:
if self.thumb_keep_original:
return "<a href='{0}' target='_blank'><img src='{1}' alt='' /></a>".format(field.url, field.url)
else:
th = get_thumbnail(field, self.thumb_size, crop=self.thumb_crop, quality=self.thumb_quality)
return "<a href='{0}' target='_blank'><img src='{1}' alt='' /></a>".format(field.url, th.url)
else:
return '-'
thumb.allow_tags = True
thumb.short_description = 'Thumb'
Test model
from django.db import models
from utils.mixins import ThumbMixin
class Book(ThumbMixin, models.Model):
title = models.CharField(u'Title', max_length=255)
photo = models.ImageField(u'Photo', upload_to=photo_upload_path)
thumb_field = 'photo'
thumb_size = '150x150'
class Meta:
verbose_name_plural = u'Books'
verbose_name = u'book'
def __unicode__(self):
return self.title
Definition in admin.py
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'thumb')
admin.site.register(Book, BookAdmin)
Image thumbnail for admin change form
To show image instead of the file path in edit pages, using ImageWidget is nice way to do it. First, define auxiliary file widget and ModelAdmin.
# file utils.py
from django.contrib.admin.widgets import AdminFileWidget
from django.utils.safestring import mark_safe
from django.contrib import admin
class ImageWidget(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>' % \
(image_url, image_url, file_name))
output.append(super(AdminFileWidget, self).render(name, value, attrs))
return mark_safe(u''.join(output))
class ImageWidgetAdmin(admin.ModelAdmin):
image_fields = []
def formfield_for_dbfield(self, db_field, **kwargs):
if db_field.name in self.image_fields:
request = kwargs.pop("request", None)
kwargs['widget'] = ImageWidget
return db_field.formfield(**kwargs)
return super(ImageWidgetAdmin, self).formfield_for_dbfield(db_field, **kwargs)
Usage
# file admin.py
from .utils import ImageWidgetAdmin
class MovieAdmin(ImageWidgetAdmin):
image_fields = ['poster']