【问题标题】:change list display link in django admindjango admin中的更改列表显示链接
【发布时间】:2011-04-29 06:23:36
【问题描述】:

我正在尝试更改 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>

【问题讨论】:

    标签: django django-admin modeladmin


    【解决方案1】:

    解决方案是覆盖初始化并将 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, )
    

    【讨论】:

    • 使用 Django 3.0 和 allow_tags 对我不起作用,但在返回之前在 html 上应用 mark_safe
    【解决方案2】:

    我相信正确的做法是继承 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
    

    【讨论】:

      【解决方案3】:

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

      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"
      

      【讨论】:

        【解决方案4】:

        这里是ModelAdmin 选项ModelAdmin.list_display_links 的Django 3.1 文档的链接。

        【讨论】:

        【解决方案5】:

        在我自己遵循这个想法(从列表显示链接到实际页面)之后,我有了第二个想法。您必须考虑两个页面:模型的管理页面和模型的实际公共页面(可能是详细视图)。如果您从管理员链接到公共页面(即使它是 CMS 页面),您将失去与其管理页面的连接。

        模型的管理页面实际上通过“预览”链接(通常位于右上角)链接到公共页面。此链接源自model_object.get_absolute_url()

        因此,如果您想更改预览链接指向的位置,您只需覆盖get_absolute_url()。在这种情况下,无论如何,这样做可能是件好事,因为您可能还想在所有其他地方使用该 url。

        【讨论】:

          【解决方案6】:

          您需要覆盖模板,因为链接被包装在那里。看看Edit Django User admin template

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-10-20
            • 2016-08-11
            • 1970-01-01
            • 2015-01-10
            • 2011-03-25
            • 1970-01-01
            • 1970-01-01
            • 2016-04-23
            相关资源
            最近更新 更多