【发布时间】:2018-06-05 19:51:43
【问题描述】:
删除了对 ModelAdmin 方法的 allow_tags 属性的支持。
【问题讨论】:
删除了对 ModelAdmin 方法的 allow_tags 属性的支持。
【问题讨论】:
刚刚找到答案,使用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)
【讨论】:
format_html(): "... 所以,不要写:mark_safe(...) ... 你应该改用:format_html(...) ..."
除了其他答案,您还可以使用 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 的简单方法。
【讨论】:
如果您的代码在 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 中测试。
【讨论】:
TL;DR:您可能应该使用 format_html() 而不是 mark_safe,正如其他答案所建议的那样。
其他答案推荐使用mark_safe 的方式只会将整个结果字符串标记为安全的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 sn-ps 的数据都应该事先单独转义。幸运的是,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(),它使用该样式。
【讨论】: