删除了对ModelAdmin方法的allow_tags属性的支持。
答案 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()
的,并且使用了这种样式。