为简单起见,假设我的模型产品和模型参数。默认情况下,在模型产品中,我想要这些设置:
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')
在参数添加/编辑中,我添加了Product作为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')
任何帮助表示感谢。
答案 0 :(得分: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
从app的管理员那里,我正在打电话:
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
功能的覆盖。对我来说,它变得没必要,因为我需要在普通和弹出视图中进行相同的搜索。但是,只有负面的无法覆盖是你可以按字段搜索不可见的,这似乎不是那么大的问题......
希望这对任何人都有帮助。