Python 如何将过滤后的查询集从listview传递到另一个使用PDFTemplateView进行打印的视图?

Python 如何将过滤后的查询集从listview传递到另一个使用PDFTemplateView进行打印的视图?,python,django,Python,Django,我正在尝试使用带有django过滤器过滤列表视图查询集的wkhtmltopdf打印 我无法使用post,因为我的list.html模板不是表单 filter_set = [] class IssueListView(TemplateListView): def get_context_data(self, **kwargs): context = super(IssueListView, self).get_context_data(**kwargs)

我正在尝试使用带有django过滤器过滤列表视图查询集的wkhtmltopdf打印

我无法使用post,因为我的list.html模板不是表单

filter_set = []

class IssueListView(TemplateListView):

    def get_context_data(self, **kwargs):
        context = super(IssueListView, self).get_context_data(**kwargs)
        global filter_set
        filter_set = []
        for issue in context['object_list']:
            filter_set.append(issue.pk)
        return context

class IssuePDF(ReportTemplateView):
    report_title = 'Complaints Register'
    model = Issue
    object_list = Issue.objects.all()

    def get_context_data(self, **kwargs):
        context = super(IssuePDF, self).get_context_data(**kwargs)
        context['report_title'] = self.report_title
        context['object_list'] = self.model.objects.all()
        global filter_set
        context['object_list'] = Issue.objects.filter(pk__in=filter_set)
        return context

这是因为我当前使用的是全局变量,但每次在生产服务器中打印时查询集都会更改。

有两种方法可以实现这一点

一个是存储在会话中,如下所示:

class IssueListView(TemplateListView):

    def get_context_data(self, **kwargs):
        context = super(IssueListView, self).get_context_data(**kwargs)
        self.request.session['filter_set'] = list(context['object_list'].values_list('pk', flat=True))  # This can be done get_queryset method as well
        return context
<a href="{url 'app_name:print_view_url_name'}?filter_set={{ filter_set }}"
class IssuePDF(ReportTemplateView):
    report_title = 'Complaints Register'
    model = Issue
    object_list = Issue.objects.all()

    def get_context_data(self, **kwargs):
        context = super(IssuePDF, self).get_context_data(**kwargs)
        context['report_title'] = self.report_title
        filter_set = self.request.GET.get('filter_set', None)
        if filter_set:
            context['object_list'] = Issue.objects.filter(pk__in=filter_set)
        return context
并在
IssuePDF
中使用它:

class IssuePDF(ReportTemplateView):
    report_title = 'Complaints Register'
    model = Issue
    object_list = Issue.objects.all()

    def get_context_data(self, **kwargs):
        context = super(IssuePDF, self).get_context_data(**kwargs)
        context['report_title'] = self.report_title
        filter_set = self.request.session.get('filter_set', None)
        if filter_set:
            context['object_list'] = Issue.objects.filter(pk__in=filter_set)
        return context
另一种实现方法是将上下文作为get参数传递。像这样:

 class IssueListView(TemplateListView):

    def get_context_data(self, **kwargs):
        context = super(IssueListView, self).get_context_data(**kwargs)
        context['filter_set'] = list(context['object_list'].values_list('pk', flat=True)) 
        return context
在模板中,更新打印按钮/链接,如下所示:

class IssueListView(TemplateListView):

    def get_context_data(self, **kwargs):
        context = super(IssueListView, self).get_context_data(**kwargs)
        self.request.session['filter_set'] = list(context['object_list'].values_list('pk', flat=True))  # This can be done get_queryset method as well
        return context
<a href="{url 'app_name:print_view_url_name'}?filter_set={{ filter_set }}"
class IssuePDF(ReportTemplateView):
    report_title = 'Complaints Register'
    model = Issue
    object_list = Issue.objects.all()

    def get_context_data(self, **kwargs):
        context = super(IssuePDF, self).get_context_data(**kwargs)
        context['report_title'] = self.report_title
        filter_set = self.request.GET.get('filter_set', None)
        if filter_set:
            context['object_list'] = Issue.objects.filter(pk__in=filter_set)
        return context

非常感谢,我猜第二种解决方案更安全,对吗?你可以使用其中任何一种。他们两个都很安全。明白了,非常感谢,在过去的三天里一直在努力解决这个问题。我认为使用会话是不安全的。