【问题标题】:How do I add a custom column with a hyperlink in the django admin interface?如何在 django 管理界面中添加带有超链接的自定义列?
【发布时间】:2026-02-21 12:20:04
【问题描述】:

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

【问题讨论】:

标签: django django-admin


【解决方案1】:

在您的 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 的文档。

【讨论】:

  • 前几天我发现您实际上不需要a 标签,因为 Django 管理员会自动将 URL 转换为超链接。我不在我的工作电脑上,所以我可能是错的。就我而言,我不需要设置allow_tags。我还在我的模型上创建了一个get_url() 函数,而不是我的管理模型——但这相当微不足道。但是,如果我们想使用 target=_blank 在新窗口中打开链接,您的方式是最好的——希望这会有所帮助。
  • @JRodDynamite 这对于最新的 django 版本不再有效。您能否添加这个也适用的 django 版本?谢谢
  • 这是最新解决方案的帖子:*.com/a/50989257/1331671
【解决方案2】:

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

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 了解更多信息。

【讨论】:

  • 这对我来说非常有效。我唯一的区别(似乎它可能是一个新的更新是使用'instance'而不是'obj'。让我在下面作为一个例子回答。感谢Seppo的帖子!
【解决方案3】:

我使用的是“实例”而不是“obj”。在我使用 Django 3.0.1 时,Seppo Erviälä 的回答对我帮助最大。

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

【讨论】: