【问题标题】:Get the current queryset shown in ChangeList from the ModelAdmin class从 ModelAdmin 类中获取 ChangeList 中显示的当前查询集
【发布时间】:2013-10-31 09:52:53
【问题描述】:

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

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

list_display = getListDisplay(qs)

我想将当前查询集传递给getListDisplay,因为根据它的不同,list_display 会有所不同。

是否有任何当前的查询集属性可以从 ModelAdmin 类访问?

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()

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    这是ModelAdmin.get_queryset()文档的链接

    编辑以响应您的 cmets: 在我看来,您想要做的是动态构建 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
    

    【讨论】:

    • 这很好,但我仍然遇到同样的问题:在qs 我有整个查询(表中的所有元素),而不是更改列表视图中显示的真正子查询。它从 1 到 100、从 101 到 200 分页,依此类推。我需要确切显示的内容。我检查了get_pagination,但没有返回当前元素...无论如何,非常感谢!
    • @toscanelli:不客气。正在构建分页的变量应该在该 get_list_display 方法中的请求对象中可用,所以也许您可以使用这些变量来构建您的 list_display 而不是实际的查询集?
    • 这是关键!我从请求request.GET.get(variable) 中得到了分页,并用它构建了list_display。谢谢你们,@Павел Тявин 和你们。
    【解决方案2】:

    在 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 对象的一些属性。因此,您可以在初始化后立即执行此操作:

    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 默认不具备此功能。

    【讨论】:

    • 谢谢。我知道这件事,但我相信这仅适用于更改列表中选择的对象,而我真正需要的是当前更改列表表单中出现的所有对象。我编辑我的问题以解释我需要什么,因为我认为 @hellsgate 对我也没有帮助。
    • 这似乎非常接近我的需要。但我不明白这个qs = self.getquery_set(),因为我将getquery_set 定义为@hellsgate 告诉我here
    • 你知道self代表什么吗?
    • 我的意思是,如果我像在doc get_queryset(self, request) 中那样定义get_queryset,我就没有那个请求,如果我定义了函数get_queryset(self) (没有request)它在qs = super(YourAdmin, self).get_queryset() 行中显示'super' object has no attribute 'get_queryset'
    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2021-12-10
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多