Django 2.0の管理画面でImageField一覧表示

Created 2018年5月30日16:44
Updated 2018年6月2日14:03
Categories Django Python

DjangoでImageFieldを利用する際、下画像のように管理画面からサムネイルを一覧表示したいシチュエーションがあると思います。

今回は Django2.0.5 を使ったのですが、今までの方法ではうまくいかなかったのでメモ。

古いコード

models.py

class Image(models.Model):
    image = models.ImageField(upload_to="/image")

というモデルクラスに対して、

admin.py

class ImageAdmin(admin.ModelAdmin):
    list_display = ["image_tag"]

    def image_tag(self, obj):
        return '<image src="{}" />'.format(obj.image)
    image_tag.allow_tags = True

admin.site.register(Image, ImageAdmin)

で表示できましたが、Django 2.0ではタグが文字列で表示されてしまいうまくいきません。

解決策

インジェクションの危険性のない安全な文字列に対しては、mark_safeを指定することでタグとして描画することができるようです。

admin.py

from django.utils.safestring import mark_safe


class ImageAdmin(admin.ModelAdmin):
    list_display = ["image_tag"]

    def image_tag(self, obj):
        return mark_safe('<image src="{}" />'.format(obj.image.url))

admin.site.register(Image, ImageAdmin)

mark_safeと言えばDjangoのテンプレートでもお世話になりました。

こちらの方がすっきり書けて良いですね。

参考

コメントを投稿

コメント