Python 如何将过滤后的查询集从listview传递到另一个使用PDFTemplateView进行打印的视图?
我正在尝试使用带有django过滤器过滤列表视图查询集的wkhtmltopdf打印 我无法使用post,因为我的list.html模板不是表单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)
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
非常感谢,我猜第二种解决方案更安全,对吗?你可以使用其中任何一种。他们两个都很安全。明白了,非常感谢,在过去的三天里一直在努力解决这个问题。我认为使用会话是不安全的。