2015-03-03 169 views

回答

23

你可以做到以下几点:

models.py(例如):

model B(models.Model): 
    name = models.CharField(max_length=20) 

model A(models.Model): 
    field1 = models.CharField(max_length=20) 
    Bkey = models.ForeignKey(B) 

admin.py

from django.core import urlresolvers 

class AAdmin(admin.ModelAdmin): 
    list_display = ["field1","link_to_B"] 
    def link_to_B(self, obj): 
     link=urlresolvers.reverse("admin:yourapp_b_change", args=[obj.B.id]) #model name has to be lowercase 
     return u'<a href="%s">%s</a>' % (link,obj.B.name) 
    link_to_B.allow_tags=True 

与您的应用程序的名称替换yourapp。

+5

万一有人使用这个答案也一样,你的模型在'reverse'功能是小写。那将是:''admin:yourapp_yourmodel_change“'。 – 2016-06-04 17:15:54

+0

@RaphaëlGomès:感谢您的输入,编辑了答案。 – 2016-06-05 05:49:42

+0

你会得到什么错误? – 2016-07-15 10:21:29

2

此外接受的答案的,在Django(1.10,1.11和2.0)时,反向方法的较新版本现在是在封装django.urls(参见this link)。

此外,您必须使用mark_safe方法在管理员中输出HTML。所以allow_tags变得毫无用处。

最后,将链接添加到用户,我在admin.py这个功能:

from django.urls import reverse 
from django.utils.safestring import mark_safe 


class ObjectAdmin(admin.ModelAdmin): 
    list_display = ('name', 'link_to_user') 

    def link_to_user(self, obj): 
     link = reverse("admin:auth_user_change", args=[obj.user.id]) 
     return mark_safe('<a href="%s">Edit %s</a>' % (link, obj.user.username)) 
    link_to_user.short_description = 'Edit user' 
+0

我建议使用['format_html'](https://docs.djangoproject .com/en/stable/ref/utils /#django.utils.html.format_html)而不是'mark_safe'。 – batisteo 2018-03-08 20:11:06