2010-01-28 91 views
47

我有一个django管理界面,并在模型列表中我想要一个自定义列,将使用其中一个字段值的超链接。基本上模型的一个领域是一个网址,我希望列可以在一个可点击的超链接中的URL。此链接需要在模型字段中添加附加的URL作为其相对路径。如何在django管理界面中添加超链接自定义列?

+1

的可能的复制[如何可点击的链接添加到Django管理现场?](http://stackoverflow.com/questions/1949248/how-to-add-clickable-links-to-a-field-in -django-admin) – Louis 2016-05-23 22:57:44

回答

60

定义您的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的文档的更多细节。

+0

有一天我发现你实际上不需要'a'标签,因为Django管理员会自动将URL变成超链接。尽管我不在工作电脑上,但我可能会错的。在我的情况下,我不需要设置'allow_tags'。我也在我的模型上创建了一个'get_url()'函数,而不是我的管理模型 - 但这很简单。然而,如果我们想用'target = _blank'在一个新窗口中打开链接,你的方式是最好的 - 希望这会有所帮助。 – 2010-01-29 21:56:11

10

使用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

相关问题