如何在django 2.0 admin中使用allow_tags?

时间:2017-12-23 15:29:15

标签: python django

  

删除了对ModelAdmin方法的allow_tags属性的支持。

4 个答案:

答案 0 :(得分:51)

刚刚找到了答案!使用mark_safe函数

在旧代码中,您可以使用:

def image_(self, obj):
    return '<image src="%s" />' % obj.image
image_.allow_tags = True

在新代码中,您应该使用:

from django.utils.safestring import mark_safe
def image(self, obj):
    return mark_safe('<image src="%s" />' % obj.image)

答案 1 :(得分:11)

除了其他答案外,您还可以使用mark_safe函数作为装饰器:

from django.utils.safestring import mark_safe

@mark_safe
def icon_pw(self, obj):
    return f'<img src="{obj.icon.url}" />' if obj.icon else ''
icon_pw.short_description = 'Icon'
icon_pw.allow_tags = True

这是将旧的Django管理代码升级到2.0的简便方法。

答案 2 :(得分:4)

如果您的代码位于admin.py,则可以覆盖仅添加mark_safe功能,如下例所示:

from django.utils.safestring import mark_safe

def get_image_tag(self):
        if self.picture:
            return mark_safe('<img src="%s" width="60" height="75" />' % self.picture.url)
        else:
            return ' '
get_image_tag.short_description = 'Photo'
#get_image_tag.allow_tags = True #redundant
get_image_tag.admin_order_field = 'name'

此代码在Django 2.0.2和Python 3.6.4中进行了测试。

答案 3 :(得分:1)

TL; DR:您可能应该使用format_html()而不是mark_safe,如其他答案所推荐。

其他答案建议使用mark_safe的方式只会将 entire 结果字符串标记为安全HTML。 IOW,您正在告诉Django“这是有效且安全的HTML,我确保已发生任何所需的转义”。除了其他答案实际上并没有进行必要的转义。

从另一个答案考虑以下(不完美)方法:

from django.utils.safestring import mark_safe
def image(self, obj):
    return mark_safe('<image src="%s" />' % obj.image)

如果obj.image现在包含",或者更糟的是用户输入并包含XSS攻击,这将破坏结果HTML。

为防止这种情况,所有插入到 这样的HTML代码段中的数据都应事先进行转义。幸运的是,html_format() function既可以进行插值,也可以进行所需的转义。这样,上面的示例将变为:

from django.utils.html import format_html
def image(self, obj):
    return format_html('<image src="{}" />', obj.image)

请注意,他使用{}格式的字符串而不是%s,因为format_html()是基于str.format()的,并且使用了这种样式。