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