Django管理员:如何动态设置每页的列表
我遇到过这样的情况:我正在为一个利用站点的django管理部分的项目管理代码库。django admin的所有功能也存在于普通视图中,但由于某些原因,客户端更喜欢使用admin视图,而不是基于函数的视图。。。通常,在基于函数的视图中添加下拉列表和调整分页/过滤器会很容易,但我能看到的唯一修改方法是使用 如何将下拉列表添加到管理页面(最好使用分页按钮),然后如何在服务器端检索结果,以根据用户选择的内容动态更改每页的列表值?将表单添加到模板并在管理中检索帖子是否可行?免责声明: 我在回答我自己的问题,所以我不确定这是最佳实践还是实现这一目标的最佳方式。然而,我所有的搜索结果都为0,所以我决定分享它,以防其他人需要此功能。如果有人有更好的方法来实现这一点,或者知道我正在做一些不安全的事情,请让我知道 我会尝试向URL追加一个查询参数,然后通过服务器端的请求检索该参数,以设置每页的Django管理员:如何动态设置每页的列表,django,django-admin,Django,Django Admin,我遇到过这样的情况:我正在为一个利用站点的django管理部分的项目管理代码库。django admin的所有功能也存在于普通视图中,但由于某些原因,客户端更喜欢使用admin视图,而不是基于函数的视图。。。通常,在基于函数的视图中添加下拉列表和调整分页/过滤器会很容易,但我能看到的唯一修改方法是使用 如何将下拉列表添加到管理页面(最好使用分页按钮),然后如何在服务器端检索结果,以根据用户选择的内容动态更改每页的列表值?将表单添加到模板并在管理中检索帖子是否可行?免责声明: 我在回答我自己的问题
列表。为了添加下拉列表和参数,修改特定管理结果的媒体类以包含一些额外的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)