【发布时间】:2026-02-21 12:20:04
【问题描述】:
我有一个 django 管理界面,并且在模型列表中我想要一个自定义列,该列将是使用其中一个字段值的超链接。基本上,模型的字段之一是 url,我希望该列在可点击的超链接中包含该 URL。此链接需要在其前面附加额外的 URL,作为模型字段中的相对路径。
【问题讨论】:
标签: django django-admin
我有一个 django 管理界面,并且在模型列表中我想要一个自定义列,该列将是使用其中一个字段值的超链接。基本上,模型的字段之一是 url,我希望该列在可点击的超链接中包含该 URL。此链接需要在其前面附加额外的 URL,作为模型字段中的相对路径。
【问题讨论】:
标签: django django-admin
在您的 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 在新窗口中打开链接,您的方式是最好的——希望这会有所帮助。
使用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 了解更多信息。
【讨论】:
我使用的是“实例”而不是“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'
【讨论】: