Django-admin:如何在记录变更列表中显示对象信息页面的链接而非编辑表单?

10 投票
2 回答
13536 浏览
提问于 2025-04-15 13:06

我正在为我正在开发的一个应用程序定制Django-admin。目前定制的部分运行得不错,我添加了一些视图。但我想知道如何将记录链接在更改列表中改成显示一个信息页面,而不是显示更改表单?

在这篇博客文章中:http://www.theotherblog.com/Articles/2009/06/02/,Tom提到:

“你可以通过定义一个函数来在列表视图中添加图片或链接,然后设置 my_func.allow_tags = True。”

但我对此并没有完全理解!!

现在我有一个个人资料函数,我希望当我点击记录列表中的某个成员时,可以显示该成员的资料(或者添加一个叫做“个人资料”的按钮),另外还想为每个成员添加一个链接(编辑:可以让我跳转到该成员的编辑表单)。

我该如何实现呢?

2 个回答

10

看看这个链接:http://docs.djangoproject.com/en/dev/ref/contrib/admin/,里面有提到ModelAdmin.list_display的部分。它说:这个字符串代表模型上的一个属性。它的行为和可调用对象几乎一样,不过在这个上下文中,self指的是模型的实例。下面是一个完整的模型示例:

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    color_code = models.CharField(max_length=6)

def colored_name(self):
    return '<span style="color: #%s;">%s %s</span>' % (self.color_code, self.first_name, self.last_name)
colored_name.allow_tags = True

class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'colored_name')

所以我猜,如果你把这两个方法加到Person里

def get_absolute_url(self):
    return '/profiles/%s/' % (self.id)

def profile_link(self):
    return '<a href="%s">%s</a>' % (self.get_absolute_url(), self.username)
profile_link.allow_tags = True

然后把PersonAdmin改成

class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'colored_name', 'profile_link')

那么你就完成了

23

如果我理解你的问题没错的话,你是想在列表视图中添加一个自己的链接,并且希望这个链接指向你创建的某个信息页面。

要做到这一点,你需要在你的管理对象中创建一个函数,用来返回链接的HTML代码。然后在你的列表中使用这个函数。像这样:

class ModelAdmin(admin.ModelAdmin):
    def view_link(self):
        return u"<a href='view/%d/'>View</a>" % self.id
    view_link.short_description = ''
    view_link.allow_tags = True
    list_display = ('id', view_link)

撰写回答