23 Ocak 2015 Cuma

Django Admin Panel Resim Thumbnail

Django'da model içerisinde imagefield kullandığınız zaman admin panelinde form içerisinde bu resmi göremiyoruz. Sadece resmin adı görünmektedir. Bu yazıda bu resmi küçük bir şekilde nasıl görebiliriz ondan bahsedeceğiz. İlk önce model oluşturalım.
#models.py
from django.db import models

class Image(models.Model):
    name = models.CharField(max_length=255)
    image = models.ImageField(upload_to="image")

İlk önce listeleme sayfasında resimleri gösterelim. Bildiğiniz gibi admin sayfasında elemanları listelerken list_display özelliği ile istediğimiz alanları ve istediğimiz herhangi bir fonksiyondan dönen değeri yazdırabiliyoruz. Şimdi model içerisinde bir fonksiyon oluşrulım ve bu fonksiyon bize resmi döndürsün.
class Image(models.Model):
    name = models.CharField(max_length=255)
    image = models.ImageField(upload_to="image")

    def image_thumb(self):
        return '<img src="%s" height="200" width="300"/>' % (self.image.url)
    image_thumb.short_description = 'Resim'
    image_thumb.allow_tags = True
Daha sonra admin.py içerisine şu kodları yazıyoruz.
from django.contrib import admin

class ImageAdmin(admin.ModelAdmin):
    list_display = ['name', 'image_thumb']

admin.site.register(Image, ImageAdmin)
Artık model satıları listelenirken resimleri görebiliyoruz.
Bu işlemden sonra resmin içeriğini görmek için tıklarsanır şöyle bir çıktı alacaksınız.
Gördüğünüz gibi resim görünmemekte sadece resmin yolu görünmektedir. Şimdi burada da resmi gösterelim. Yapmamız gereken admin.py dosyasına şu kodları eklemek.
from django.contrib.admin.widgets import AdminFileWidget
from django.utils.safestring import mark_safe


class ImageWidget(AdminFileWidget):
    def render(self, name, value, attrs=None):
        output = []
        if value and hasattr(value, "url"):
            output.append(('<a target="_blank" href="%s">'
                           '<img src="%s" height="100" title="%s"/></a> '
                           % (value.url, value.url, value.name)))
        output.append(super(AdminFileWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))
Burada özel bir widget ekliyoruz. Bu widget aldığı alan için bir geri değer döndürecek. Son olarak yapmamız gereken ise image alanımıza bu widgetı tanımlamak bunun için yine admin.py dosyasında az önce yazdığımız ImageAdmin sınıfını değiştirmek.
class ImageAdmin(admin.ModelAdmin):
    list_display = ['name', 'image_thumb']
    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name == 'image':
            request = kwargs.pop("request", None)
            kwargs['widget'] = ImageWidget
            return db_field.formfield(**kwargs)
        return super(ImageAdmin, self).formfield_for_dbfield(db_field, **kwargs)


admin.site.register(Image, ImageAdmin)
Artık resmi düzenleme sayfasında da görebiliyoruz.
Siz burada kendinize göre biraz daha özelleştirebilirsiniz.

0 yorum :

Yorum Gönder