web-dev-qa-db-ja.com

Django管理者がhtmlをエスケープしないようにする

Django admin's list_displayに画像のサムネイルを表示しようとしていますが、次のようにしています。

from Django.utils.safestring import mark_safe

class PhotoAdmin(admin.ModelAdmin):
    fields = ('title', 'image',)
    list_display = ('title', '_get_thumbnail',)

    def _get_thumbnail(self, obj):
        return mark_safe(u'<img src="%s" />' % obj.admin_thumbnail.url)

文字列を安全としてマークしましたが、管理者はサムネイルをエスケープされたhtmlとして表示し続けます。私は何が間違っているのですか?

38
Andy

Django 1.9以降、 format_html()format_html_join() 、または-を使用できます。 _allow_tags_ メソッド内。詳細については _list_display_ ドキュメントを参照してください。

_mark_safe_を使用した質問のコードは機能します。ただし、これらのようなメソッドのより良いオプションは、引数をエスケープする_format_html_である可能性があります。

_def _get_thumbnail(self, obj):
    return format_html(u'<img src="{}" />', obj.admin_thumbnail.url)
_

以前のバージョンのDjangoでは、mark_safe()を使用しても機能せず、Djangoは出力をエスケープしていました。解決策は、メソッドに_allow_tags_属性を指定することでした。値をTrueに設定します。

_class PhotoAdmin(admin.ModelAdmin):
    fields = ('title', 'image',)
    list_display = ('title', '_get_thumbnail',)

    def _get_thumbnail(self, obj):
         return u'<img src="%s" />' % obj.admin_thumbnail.url
    _get_thumbnail.allow_tags = True
_
82
Alasdair