我正在创建一个自定义django管理操作,以便在模板中显示所选项目,我遇到的问题是它显示所有现有项目,我只想显示那些项目用户在管理部分中选择的内容。
这是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),但图表仍会显示所有现有项目。
答案 0 :(得分:1)
admin操作的queryset
参数已包含所选项目。改为:
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)))
顺便说一句,你应该使用反向网址解析而不是硬编码网址。
查看,我冒昧地切换到基于类的版本。无论如何,你最终都会想要这样做:
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()