From e651b3095c950627b1eed1527f2bb011ddad03de Mon Sep 17 00:00:00 2001 From: Daniel Fairhead Date: Mon, 4 Nov 2019 11:38:31 +0000 Subject: [PATCH] Fixed #15742 -- Fixed an example of collecting selected objects in ModelAdmin.actions docs. The queryset argument is already filtered, and request.POST doesn't contain all selected objects when "Select All" is used. --- docs/ref/contrib/admin/actions.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/ref/contrib/admin/actions.txt b/docs/ref/contrib/admin/actions.txt index 2cb6e8957c..9364c396b3 100644 --- a/docs/ref/contrib/admin/actions.txt +++ b/docs/ref/contrib/admin/actions.txt @@ -236,14 +236,16 @@ you'd want to let the user choose a format, and possibly a list of fields to include in the export. The best thing to do would be to write a small action that redirects to your custom export view:: - from django.contrib import admin from django.contrib.contenttypes.models import ContentType from django.http import HttpResponseRedirect def export_selected_objects(modeladmin, request, queryset): - selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) + selected = queryset.values_list('pk', flat=True) ct = ContentType.objects.get_for_model(queryset.model) - return HttpResponseRedirect("/export/?ct=%s&ids=%s" % (ct.pk, ",".join(selected))) + return HttpResponseRedirect('/export/?ct=%s&ids=%s' % ( + ct.pk, + ','.join(str(pk) for pk in selected), + )) As you can see, the action is rather short; all the complex logic would belong in your export view. This would need to deal with objects of any type, hence