在django admin中更改列表显示链接

tom*_*son 23 django modeladmin django-admin

我正在尝试更改django管理列表显示中对象的链接.这是我到目前为止:

class FooModelAdmin(admin.ModelAdmin):
    fields = ('foo','bar')
    list_display = ('foo_link','bar')

    def foo_link(self,obj):
        return u'<a href="/foos/%s/">%s</a>' % (obj.foo,obj)
    domain_link.allow_tags = True
    domain_link.short_description = "foo"
Run Code Online (Sandbox Code Playgroud)

这在原始列表显示链接中产生另一个链接,例如

<a href="/admin/app/model/pk/"><a href="/foos/foo/">Foo</a></a>
Run Code Online (Sandbox Code Playgroud)

tom*_*son 28

解决方案是覆盖init并将list_display_links设置为None,例如

class FooModelAdmin(admin.ModelAdmin):
    fields = ('foo','bar')
    list_display = ('foo_link','bar')

    def foo_link(self,obj):
        return u'<a href="/foos/%s/">%s</a>' % (obj.foo,obj)
    foo_link.allow_tags = True
    foo_link.short_description = "foo"
    def __init__(self,*args,**kwargs):
        super(FooModelAdmin, self).__init__(*args, **kwargs)
        self.list_display_links = (None, )
Run Code Online (Sandbox Code Playgroud)

  • 使用 Django 3.0 和“allow_tags”对我来说不起作用,但在返回之前在 html 上应用“mark_safe”。 (2认同)

小智 27

我相信这样做的正确方法是继承ChangeList并覆盖url_for_result方法以创建所需的正确更改URL.

覆盖admin.ModelAdmin子类中的get_changelist以返回新类:

from django.contrib.admin.views.main import ChangeList
from django.contrib.admin.util import quote

class FooChangeList(ChangeList):
    def url_for_result(self, result):
        pk = getattr(result, self.pk_attname)
        return '/foos/foo/%d/' % (quote(pk))

class FooAdmin(admin.ModelAdmin):
    def get_changelist(self, request, **kwargs):
        return FooChangeList
Run Code Online (Sandbox Code Playgroud)


Krz*_*oda 8

ModelAdmin以下是名为 的选项的 Django 3.1 文档的链接ModelAdmin.list_display_links

  • 它在 3.1 之前也可用,我在 2.2 上,它在那里 https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display_links (2认同)

Nay*_*yan 7

默认情况下,列表显示的第一列将链接到管理员编辑页面。如果您希望另一个列或多个列成为该链接,则非常简单的方法如下:

class FooModelAdmin(admin.ModelAdmin):
    list_display = ('foo_link', 'bar', 'another_bar', )
    list_display_links = ('foo_link', 'another_bar', )
Run Code Online (Sandbox Code Playgroud)

如果foo_link不是模型的属性,则它应该是可调用的,如下所示:

class FooModelAdmin(admin.ModelAdmin):
    list_display = ('foo_link', 'bar', 'another_bar', )
    list_display_links = ('foo_link', 'another_bar', )

    def foo_link(self, obj):
        return "%s blah blah" % obj.some_property # or anything you prefer e.g. an edit button
Run Code Online (Sandbox Code Playgroud)

我的项目中的完整示例:

class SchoolTeacherAdmin(admin.ModelAdmin):
    list_display = ('name', 'designation', 'school_name', 'school_code', 'date_of_birth', 'mobile', 'nid', 'edit', )
    list_display_links = ('edit', )

    def school_code(self, obj):
        return obj.school.code

    def school_name(self, obj):
        return obj.school.name.upper()

    def edit(self, obj):
        return "Edit"
Run Code Online (Sandbox Code Playgroud)