Django 管理员:有条件地设置 list_display

vma*_*tto 2 django django-models django-admin

是否有任何管理模型方法,如 get_list_display() 或某种方式,我可以有一些条件来设置不同的 list_display 值?

class FooAdmin (model.ModelAdmin):
    # ...
    def get_list_display ():
        if some_cond:
            return ('field', 'tuple',)
        return ('other', 'field', 'tuple',)
Run Code Online (Sandbox Code Playgroud)

小智 5

该类ModelAdmin有一个名为的方法get_list_display,该方法将 request 作为参数,默认返回list_display该类的属性。

所以你可以这样做:

class ShowEFilter(SimpleListFilter):
    """ A dummy filter which just adds a filter option to show the E column,
        but doesn't modify the queryset.
    """
    title = _("Show E column")
    parameter_name = "show_e"

    def lookups(self, request, model_admin):
        return [
            ("yes", "Yes"),
        ]

    def queryset(self, request, queryset):
        return queryset

class SomeModelAdmin(admin.ModelAdmin):

    list_display = (
      "a",
      "b",
      "c",
      "d",
      "e"
    )
    list_filter = (
        ShowEFilter,
    )


    def get_list_display(self, request):
        """ Removes the E column unless "Yes" has been selected in the 
            dummy filter.
        """
        list_display = list(self.list_display)
        if request.GET.get("show_e", "no") != "yes":
            list_display.remove("e")

        return list_display
Run Code Online (Sandbox Code Playgroud)