пятница, 17 июня 2011 г.

Django admin и миниатюры фотографий с помощью sorl.thumbnail

Я придерживаюсь мнения, что использовать стандартную админку Django можно не только для целей разработки но и сдавать проект вместе с ней заказчику. Особенно это касается низкобюджетных проектов или в тех случаев, когда она позволит максимально понятно и быстро управлять контентом.
Админка вроде всем хороша но есть в ней пара моментов, которые портят картину. Один из них весьма условный — это отсутствие WYSIWYG редактора. Условный он потому, что вопреки разным мнениям я все же уверен, что нужен он далеко не всегда. В большенстве случаев можно и нужно обходится чем-то вроде markdown или вообще ничем.
Второй — редактирование объектов, содержащих изображение. Проще говоря это фотки, или другие объекты к которым прицеплены картинки.
Ориентироваться в списке фоток не видя этих самых фоток очень неудобно. И я давно намеревелся найти решение этой проблемы. Пример мой подойдет тем кто использует sorl.thumbnail для создания миниатюр на сайте. Но если у вас голова не из говна, то вам не составит труда переписать процесс получения url-а миниатюрки. В целом можно сказать, что вся фишка этого поста в том, как воткнуть миниатюрку в список объектов не редактируя шаблон. Идея взята из блога чувака по имени и описана она еще в 2009 году, но работает и по сей день. Я лишь приебашил к этому делу sorl.thumbnail.

Итак суть этого способа в том, чтобы создать метод модели, который и будет отдавать html код картинки. А потом, этот метод указать в настроечном классе админки в параметре list_display. Вот так оказалось все просто.
Вот код модели:
from sorl.thumbnail.shortcuts import get_thumbnail

...

class Photos(models.Model):
    title = models.TextField(u'Заголовок')
    tags = TagField(u'Теги')
    image = ImageField(upload_to='img/photos/', verbose_name=u'Файл')

    def get_thumbnail_html(self):
        img = self.image
        img_resize_url = unicode(get_thumbnail(img, '100x100').url)
        html = '<a class="image-picker" href="%s"><img src="%s" alt="%s"/></a>'
        return html % (self.image.url, img_resize_url, self.title)
    get_thumbnail_html.short_description = u'Миниатюра'
    get_thumbnail_html.allow_tags = True
Вот настроечный класс:
class PhotoAdmin(admin.ModelAdmin):
    list_display = ['get_thumbnail_html', 'title', 'tags']
    list_display_links = ['title', ]

admin.site.register(Photos, PhotoAdmin)

Комментариев нет:

Отправить комментарий