2016-01-25 6 views
0

Я создаю собственное действие администратора django для отображения выбранных проектов в диаграмме, которая у меня есть в шаблоне, проблема, с которой я сталкиваюсь, заключается в том, что она отображает все существующие проекты, и я хочу просто чтобы отобразить те, которые пользователь выбирает в админ-части.Django - Custom admin action

Вот admin.py часть, которая должна фильтровать проекты, которые были выбраны пользователем:

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

Вот view.py часть, которая должна получить отфильтрованные проекты:

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

Когда я откройте сайт диаграммы, URL-адрес показывает элементы, которые пользователь выбрал правильно (например, http://x.x.x.x:xxxx/xxx/?ct=15&ids=10,1,3,5), но на диаграмме все еще отображаются все существующие проекты.

ответ

1

Параметр queryset действию администратора уже содержит выбранные проекты. Alter на:

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 вы должны использовать обратный адрес разрешающий вместо жесткого кодирования URL.

Просмотреть, что я взял на себя смелость перейти на классную версию. В любом случае вы захотите сделать это в конечном итоге:

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