2

为简单起见,假设我有模型Product和模型参数。默认情况下,在模型产品中我想要这些设置:

class ProductAdmin(ModelAdmin):
    list_display = ('name', 'brand', 'sort', 'specific', 'link_to_frontend', 'category_names', 'ean', 'created', 'creator')
    list_filter = ('category', 'creator')
    search_fields = ('name', 'brand__name', 'sort', 'specific', 'category__name', 'ean')

参数添加/编辑中,我已将产品添加为 raw_id_fields。由于我在默认产品列表中有很多列,如果弹出,我想做不同的设置:

class ProductAdmin(ModelAdmin):
    list_display = ('name', 'brand', 'sort', 'specific', 'category_names')
    list_filter = ()
    search_fields = ('name', 'brand__name', 'sort', 'specific', 'category__name')

任何帮助表示赞赏。

4

1 回答 1

4

最后,找到了解决方案。我在通用应用程序的admin.py文件中创建了一个通用的自己的 ModelAdmin 类:

from django.contrib import admin
from django.contrib.admin.views.main import IS_POPUP_VAR

class YourModelAdmin(admin.ModelAdmin):
    popup_list_display = ()
    popup_list_filter = ()

    def get_list_display(self, request):
        if IS_POPUP_VAR in request.GET and self.popup_list_display: # return list_display if not set
            return self.popup_list_display
        else:
            return self.list_display

    def get_list_filter(self, request):
        if IS_POPUP_VAR in request.GET: # return empty tuple if not set
            return self.popup_list_filter
        else:
            return self.list_filter

从应用程序的管理员那里,我打电话给:

from django.contrib import admin
from [your-uni-app].admin import YourModelAdmin # not necessary if in same file

class ProductAdmin(YourModelAdmin): # e.g.
    list_display = ('name', 'category', 'properties',)
    popup_list_display = ('name', 'category',)
    # same settings for list_filter and popup_list_filter

admin.register(Product, ProductAdmin)

此解决方案还对基于某些用户角色(例如)的条件 list_display 或在返回之前使用 list_display 进行操作(将任何列自动添加到所有列表)开放。如果被覆盖,list_filter 和 django.contrib.admin.ModelAdmin(或 BaseModelAdmin)中的任何函数都相同。

覆盖search_fields意味着创建django.contrib.admin.ModelAdmin.chagnelist_view函数的覆盖。对我来说,它变得没有必要,因为我需要在普通视图和弹出视图中进行相同的搜索。但是,无法覆盖的唯一缺点是您可以按不可见的字段进行搜索,这似乎不是什么大问题...

希望这对任何人都有帮助。

于 2013-05-26T01:34:47.560 回答