【发布时间】:2018-07-19 15:59:54
【问题描述】:
我正在使用 CBV 在 Django 2 中创建一个列表视图。分页正在工作,但是我现在正在尝试将排序添加到我的分页中。这种排序将起作用,当用户选择一列时,它将附加一个 GET 查询字符串,然后当我呈现我的视图时,我将 order_by QueryResult。
这是可行的,但是我现在只获取 4 个条目(我的当前页面),而不是整个集合。我的问题是我需要它只过滤当前页面结果,然后返回当前页面和其余结果。
这是我目前的解决方案:
class AccountList(ListView):
ordering_dict = {
'pk':'asc', 'is_active':'asc','created':'asc'
}
template_name = "marketing/comm_list.html"
context_object_name = 'comms'
paginate_by = 4
def get_queryset(self):
type_filter = self.request.GET.get('type', 'all')
queryset = Comm.objects.values('pk', 'name', 'is_active', 'created')
page_field = self.request.GET.get('page')
paginator = Paginator(queryset, 4)
try:
pages = paginator.page(page_field)
except PageNotAnInteger:
pages = paginator.page(1)
except EmptyPage:
pages = paginator.page(paginator.num_pages)
start_index = pages.start_index()
end_index = pages.end_index()
queryset = Comm.objects.values('pk', 'name', 'is_active', 'created').filter(pk__gte=start_index, pk__lte=end_index)
order_by_field = self.request.GET.get('order_by')
if order_by_field:
if self.ordering_dict[order_by_field] == 'asc':
self.ordering_dict[order_by_field] = 'desc'
else:
self.ordering_dict[order_by_field] = 'asc'
order_by_field = '-'+order_by_field
queryset = queryset.order_by(order_by_field)
else:
queryset = queryset.order_by('-created')
return queryset
感谢任何帮助,我正在使用 Django 2 和 Python 3.6。谢谢!
一般问题是我希望能够仅在分页结果的当前页面上按列排序
【问题讨论】:
-
你需要在客户端解决这个问题,而不是在服务器端。使用对列进行客户端排序的数据表小部件;它只会对页面上显示的内容进行排序。
标签: python django pagination