osp*_*der 63
刚刚找到答案!使用mark_safe功能
在旧代码中,您可以使用:
def image_(self, obj):
return '<image src="%s" />' % obj.image
image_.allow_tags = True
Run Code Online (Sandbox Code Playgroud)
在新代码中,您应该使用:
from django.utils.safestring import mark_safe
def image(self, obj):
return mark_safe('<image src="%s" />' % obj.image)
Run Code Online (Sandbox Code Playgroud)
Dmi*_*nin 16
除了其他答案,您可以使用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
Run Code Online (Sandbox Code Playgroud)
这是将旧的Django管理代码升级到2.0的简便方法.
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)
Run Code Online (Sandbox Code Playgroud)
如果obj.image现在包含",或更糟糕的是,用户输入并包含 XSS 攻击,这将破坏生成的 HTML。
为了防止这种情况,插入到此类 HTML 片段中的所有数据都应事先单独转义。幸运的是,有一个html_format()函数可以同时进行插值和所需的转义。这样,上面的例子就变成了:
from django.utils.html import format_html
def image(self, obj):
return format_html('<image src="{}" />', obj.image)
Run Code Online (Sandbox Code Playgroud)
请注意,他使用{}格式字符串而不是%s,因为format_html()它基于str.format(),它使用该样式。
小智 7
如果您有代码,则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'
Run Code Online (Sandbox Code Playgroud)
此代码在 Django 2.0.2 和 Python 3.6.4 中进行了测试。
| 归档时间: |
|
| 查看次数: |
7107 次 |
| 最近记录: |