防止 django 管理员转义 html

Posted

技术标签:

【中文标题】防止 django 管理员转义 html【英文标题】:Prevent django admin from escaping html 【发布时间】:2011-03-18 21:43:51 【问题描述】:

我正在尝试在 django 管理员的 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。我做错了什么?

【问题讨论】:

【参考方案1】:

从 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

【讨论】:

感谢您的澄清,我在文档中找不到。 @Andy,如果这对您有用,请单击该答案必须接受它的分数下方的复选标记。 不确定,但我认为正确的语法是,而不是%s。所以应该是:format_html(u'&lt;img src="" /&gt;', obj.admin_thumbnail.url).【参考方案2】:

我知道这是一个相当晚的答案,但我认为更完整的实现对其他人会有所帮助......

如果您还没有 django-filer,请获取 easy_thumbnails pip install easy-thumbnails

# -*- coding: utf-8 -*-

from django.contrib import admin

from easy_thumbnails.files import get_thumbnailer

from models import Photo


class PhotoAdmin(admin.ModelAdmin):
    list_display = ('_thumbnail', 'title', )
    list_display_links = ('_thumbnail', 'title', )  # This makes the icon clickable too
    readonly_fields = ('_thumbnail', )
    fields = ('title', 'photo', )

    def _thumbnail(self, obj):
        if obj.photo:
            thumbnailer = get_thumbnailer(obj.photo)
            thumb = thumbnailer.get_thumbnail(
                'crop': True,
                'size': (50, 50),
                # Sharpen it up a little, since its so small...
                'detail': True,
                # Put other options here...
            )
            # Note: we get the actual width/height rather than
            # hard-coding 50, 50, just to be DRYer
            return u'<img src="%s"   />' % (thumb.url, obj.photo.name, thumb.width, thumb.height)
        else:
            return "[No Image]"

    # Optional, Provide a nicer label in the display
    _thumbnail.short_description = 'Thumbnail'

    # Required, leaves the markup un-escaped
    _thumbnail.allow_tags = True

admin.site.register(Photo, PhotoAdmin)

【讨论】:

以上是关于防止 django 管理员转义 html的主要内容,如果未能解决你的问题,请参考以下文章

防止django管理员通过创建LogEntry进行更改

在 Django Admin 更改列表中显示未转义的 HTML 字符串

授予“用户更改”权限时,如何防止 Django 管理员中的权限升级?

08-Django模板

Django 模板 render传参不转码

当 DEBUG = False 时 Django 转义 javascript