Django 2.0の管理画面でImageFieldのサムネイルを一覧表示

Created 2018年5月30日16:44
Updated 2019年2月3日18:47
Categories Django Python

DjangoでImageFieldを利用する際、下画像のように管理画面にサムネイルを一覧表示する方法を調べました。

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

古いコード

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のテンプレートにコードから生成したHTMLを描画する時にもお世話になりました。

image_tag.allow_tags = Trueするより、mark_safe関数を通す方が何をやっているか分かりやすくて良いですね。

参考

コメントを投稿

コメント