Django管理员:如何动态设置每页的列表

Django管理员:如何动态设置每页的列表,django,django-admin,Django,Django Admin,我遇到过这样的情况:我正在为一个利用站点的django管理部分的项目管理代码库。django admin的所有功能也存在于普通视图中,但由于某些原因,客户端更喜欢使用admin视图,而不是基于函数的视图。。。通常,在基于函数的视图中添加下拉列表和调整分页/过滤器会很容易,但我能看到的唯一修改方法是使用 如何将下拉列表添加到管理页面(最好使用分页按钮),然后如何在服务器端检索结果,以根据用户选择的内容动态更改每页的列表值?将表单添加到模板并在管理中检索帖子是否可行?免责声明: 我在回答我自己的问题

我遇到过这样的情况:我正在为一个利用站点的django管理部分的项目管理代码库。django admin的所有功能也存在于普通视图中,但由于某些原因,客户端更喜欢使用admin视图,而不是基于函数的视图。。。通常,在基于函数的视图中添加下拉列表和调整分页/过滤器会很容易,但我能看到的唯一修改方法是使用

如何将下拉列表添加到管理页面(最好使用分页按钮),然后如何在服务器端检索结果,以根据用户选择的内容动态更改每页的列表值?将表单添加到模板并在管理中检索帖子是否可行?

免责声明:

我在回答我自己的问题,所以我不确定这是最佳实践还是实现这一目标的最佳方式。然而,我所有的搜索结果都为0,所以我决定分享它,以防其他人需要此功能。如果有人有更好的方法来实现这一点,或者知道我正在做一些不安全的事情,请让我知道

我会尝试向URL追加一个查询参数,然后通过服务器端的请求检索该参数,以设置每页的
列表。为了添加下拉列表和参数,修改特定管理结果的媒体类以包含一些额外的javascript应该允许您创建下拉列表和附加查询参数。我们需要从
请求中删除此参数。GET
否则我们将在
GET\u queryset()
中遇到问题,因为该参数与模型上的字段不匹配。为此,我们需要重写admin.py中的
changelist\u view()
方法

admin_paginator_dropdown.js
这似乎不维护与分页/筛选相关的查询参数。当这是固定的,我会修改这个答案相应。
window.addEventListener('load', function() {
    (function($) {
        // Jquery should be loaded now
        // Table paginator has class paginator. We want to append to this
        var paginator = $(".paginator");
        var list_per_page = $("<select id='list_per_page_selector'><option value=\"50\">50</option><option value=\"100\" selected>100</option><option value=\"150\">150</option><option value=\"200\">200</option><option value=\"250\">250</option></select>")
        var url = new URL(window.location);
        // Retrieve the current value for updating the selected dropdown on page refresh
        var initial_list_per_page = url.searchParams.get("list_per_page")
        paginator.append(list_per_page)
        if(initial_list_per_page === null) {
            // No choice has been made, set dropdown to default value
            $("#list_per_page_selector").val("100")
        }
        else{
            // User has a query parameter with a selection. Update the selected accordingly
            $("#list_per_page_selector").val(initial_list_per_page)
        }
        $("#list_per_page_selector").on("change", function(event) {
            // Add the list_per_page parameter to the url to be used in admin.py
            url.searchParams.set("list_per_page", event.target.value);
            //Take us to the new page.
            window.location.href = url.href;
        });
    })(django.jQuery);
});
class someModelAdmin(admin.ModelAdmin)
    class Media:
        js = ("js/admin_paginator_dropdown.js",)
    
    def changelist_view(self, request, extra_context=None):
        # Copy the request.GET so we can modify it (no longer immutable querydict)
        request.GET = request.GET.copy()
        # Pop the custom non-model parameter off the request (Comes out as an array?)
        # Force it to int
        page_param = int(request.GET.pop('list_per_page', [100])[0])
        # Dynamically set the django admin list size based on query parameter.
        self.list_per_page = page_param
        return super(someModelAdmin, self).changelist_view(request, extra_context)