如何在django 2.0 admin中使用allow_tags?

osp*_*der 24 python django

将删除对ModelAdmin方法的allow_tags属性的支持.

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)

  • 文档[推荐](https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.html.format_html) `format_html()`: "...所以,不要写:`mark_safe (...)` ...您应该使用:`format_html(...)` ..." (6认同)

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的简便方法.


Mat*_*man 8

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 中进行了测试。