从ModelAdmin类获取ChangeList中显示的当前查询集

时间:2013-10-31 09:52:53

标签: django django-admin

我需要在ModelAdmin中使用ChangeList中显示的元素,但我不知道如何获取当前的查询集。
例如,如果现在显示前100个元素,我想使用这个集合,如果用户传递给下一个100,我想在集合中有新的100个元素。
其他例子是当某些用户使用某些过滤器时。

在我的模型管理员中,我有:

list_display = getListDisplay(qs)

我想传递给getListDisplay当前的查询集,因为依赖于它,list_display会有所不同。

在ModelAdmin类中可以访问任何当前的queryset属性吗?

UPD 1 之后,我无法做到这一点:

class YourAdmin(admin.ModelAdmin):
    def get_queryset(self):
        qs = super(YourAdmin, self).get_queryset()
        return qs

    def __init__(self, *args, **kwargs):
        super(YourAdmin, self).__init__(*args, **kwargs)
        qs = self.get_queryset()

2 个答案:

答案 0 :(得分:1)

这是指向ModelAdmin.get_queryset()

文档的链接

根据您的评论进行修改: 在我看来,你想要做的是动态构建list_display。 Django有一个get_list_display方法用于模型管理。此方法接收请求,然后您可以将其传递给get_queryset:

class YourAdmin(admin.ModelAdmin):
    def get_list_display(self, request):
        qs = self.get_queryset(request)
        '''
        Now build the list_display as a list or tuple
        '''
        .
        .
        return list_display

答案 1 :(得分:0)

在django admin中,有一个名为 actions 的东西。它在here中描述并且工作方式如下:

class YourAdmin(admin.ModelAdmin):
    def make_something(self, request, queryset):
        queryset.update(status='p')
    actions = ['make_something',]

也许 queryset 是你需要的东西

UPD 1:评论后,我了解您需要修改ModelAdmin ojbect的某些属性。所以你可以在初始化后立即这样做:

class YourAdmin(admin.ModelAdmin):
    def __init__(self, *args, **kwargs):
        super(YourAdmin, self).__init__(*args, **kwargs)
        qs = self.getquery_set()
        // modify your list_display depending on qs
        self.list_display = ['some','fileds','here']

某些第三方应用程序(例如xadmin)允许您动态更改 list_display ,但django默认情况下不具备此功能。