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

2024-09-30 20:33:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用带有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

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


Tags: selfreportdatagetobjectsobjecttitlecontext
1条回答
网友
1楼 · 发布于 2024-09-30 20:33:43

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

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

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

并在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

在模板中,更新打印按钮/链接,如下所示:

<a href="{url 'app_name:print_view_url_name'}?filter_set={{ filter_set }}"

并在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.GET.get('filter_set', None)
        if filter_set:
            context['object_list'] = Issue.objects.filter(pk__in=filter_set)
        return context

相关问题 更多 >