Как я могу передать отфильтрованный набор запросов из списка в другое представление, которое использует PDFTemplateView для печати? - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь печатать с использованием wkhtmltopdf с набором запросов из отфильтрованного списка просмотра django-фильтров.

Я не могу использовать 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

Это работает, потому что в настоящее время я использую глобальную переменную, но набор запросов меняется каждый раз, когда я печатаю на производственном сервере.

1 Ответ

1 голос
/ 29 апреля 2019

Для этого есть 2 способа.

Один предназначен для хранения в сеансе, например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...