rpc
rpc

Reputation: 15

Django - Custom admin action

I'm creating a custom django admin action to show the selected Projects in a chart which I have in a template, the problem that I'm having is that it's displaying all the existing projects and I want just to display the ones which the user selects in the admin part.

Here's the admin.py part which should filter the projects that the user had selected:

    def show_gantt_chart_of_selected_projects(modeladmin, request, queryset):
    selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
    ct = ContentType.objects.get_for_model(queryset.model)
    return HttpResponseRedirect("/xxx/?ct=%s&ids=%s" % (ct.pk, ",".join(selected))) 

Here's the view.py part which should get the filtered projects:

def index(request):
projects = Project.objects.order_by('projectName') // I think this line could be the problem
    context = {'projects': projects }
    return render_to_response('xxx/ganttChart.html', context, context_instance=RequestContext(request))

When I open the chart site, the URL show the items that the user selected correctly(ex. http://x.x.x.x:xxxx/xxx/?ct=15&ids=10,1,3,5), but the chart still show all the existing projects.

Upvotes: 0

Views: 753

Answers (1)

Tomas Walch
Tomas Walch

Reputation: 2305

The queryset parameter to the admin action already contains the selected projects. Alter to:

def show_gantt_chart_of_selected_projects(modeladmin, request, queryset):
    ct = ContentType.objects.get_for_model(queryset.model)  # why do you do this, you're not using it?
    return HttpResponseRedirect("/xxx/?ct=%s&ids=%s" % (ct.pk, ",".join(queryset.values_list('pk', flat=True))) 

BTW you should use reverse url resolving instead of hardcoding urls.

View, which I took the liberty to switch to a class-based version. You will want to do this eventually anyway:

from django.views.generic import ListView

class IndexView(ListView):
    template_name = 'xxx/ganttChart.html'
    context_object_name = 'projects'
    model = Project

    def get_queryset(self):
        return Project.objects.filter(
            pk__in=self.request.GET.get('ids','').split(','),
        ).order_by('projectName')
index = IndexView.as_view()

Upvotes: 1

Related Questions