我正在尝试更改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"
这会在原始列表显示链接中生成另一个链接,例如
<a href="/admin/app/model/pk/"><a href="/foos/foo/">Foo</a></a>
答案 0 :(得分: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, )
答案 1 :(得分:24)
我相信这样做的正确方法是继承ChangeList并覆盖url_for_result方法以创建所需的正确更改网址。
覆盖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
答案 2 :(得分:4)
默认情况下,列表显示的第一列将链接到管理编辑页面。如果您希望其他列或列成为该链接,则一种非常简单的方法如下:
class FooModelAdmin(admin.ModelAdmin):
list_display = ('foo_link', 'bar', 'another_bar', )
list_display_links = ('foo_link', 'another_bar', )
如果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
我项目的完整示例:
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"
答案 3 :(得分:1)
自己遵循这个想法(从列表显示链接到实际页面)我有了第二个想法。您必须考虑两个页面:模型的管理页面和模型的实际公共页面(可能是详细视图)。如果您从管理员链接到公共页面(即使它是CMS页面),您将失去与其管理页面的连接。
模型的管理页面实际上通过&#34;预览&#34;链接到公共页面。链接(定期放在右上角)。此链接源自model_object.get_absolute_url()
。
因此,如果您想要更改预览链接指向的位置,则只需覆盖get_absolute_url()
。在这种情况下,无论如何,你做这件事可能是件好事,因为你可能也想在其他所有地方使用这个网址。
答案 4 :(得分:0)
您需要覆盖模板,因为链接已包装在那里。看看Edit Django User admin template。
答案 5 :(得分:0)
这是指向ModelAdmin.list_display_links
的ModelAdmin
选项的Django 3.1文档的链接。