如何在django管理界面中添加带超链接的自定义列?

时间:2010-01-28 16:33:26

标签: django django-admin

我有一个django管理界面,在模型列表中我想要一个自定义列,它将是一个使用其中一个字段值的超链接。基本上,模型的一个字段是一个url,我希望该列在可点击的超链接中包含该URL。此链接需要在其前面添加其他URL作为模型字段中的相对路径。

3 个答案:

答案 0 :(得分:72)

在ModelAdmin类中定义方法,并将其allow_tags属性设置为True。这将允许该方法返回未转义的HTML以便在列中显示。

然后将其列为ModelAdmin.list_display属性中的条目。

示例:

class YourModelAdmin(admin.ModelAdmin):
    list_display = ('my_url_field',)

    def my_url_field(self, obj):
        return '<a href="%s%s">%s</a>' % ('http://url-to-prepend.com/', obj.url_field, obj.url_field)
    my_url_field.allow_tags = True
    my_url_field.short_description = 'Column description'

有关详细信息,请参阅ModelAdmin.list_display的文档。

答案 1 :(得分:19)

使用format_html实用程序。这将从参数中转义任何html,并将该字符串标记为在模板中使用是安全的。 Django 1.9中已弃用allow_tags方法属性。

from django.utils.html import format_html

class MyModelAdmin(admin.ModelAdmin):
    list_display = ['show_url', ...]
    ...

    def show_url(self, obj):
        return format_html("<a href='http://pre.com{0}'>{0}</a>", obj.url)

现在您的管理员用户即使在以下情况下也是安全的:

url == '<script>eval(...);</script>'

有关详细信息,请参阅the documentation

答案 2 :(得分:0)

我正在使用“实例”而不是“ obj”。 SeppoErviälä的回答对我的帮助最大,因为我正在使用Django 3.0.1。

def get_facebook(self, instance):
    return format_html("<a target='_blank' href='{0}'>{0}</a>", instance.profile.facebook)
get_facebook.short_description = 'Facebook'