我正在使用CBV在Django 2中创建一个列表视图。分页正在运行,但是我现在正在尝试对分页进行排序。这种排序将起作用,即当用户选择列时,它将附加一个GET查询字符串,然后在渲染视图时,将对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。谢谢!
一般的问题是我希望只能在分页结果的当前页面上按列进行排序
答案 0 :(得分:0)
您可以使用它进行排序:
return sorted(queryset, key=lambda k: k.column_name])
这将在queryset
上进行迭代,并按column_name
对其进行排序。
您也可以选中k['column_name']
而不是k.column_name
,然后看看哪一个适合您。
有关Python here中sorted
函数的更多信息。
答案 1 :(得分:0)
您可以将打击类添加到模型中,以按照给出的顺序返回查询结果
Class Meta:
ordeing = ('col_name') # in order
ordeing = ('-col_name') # in reverse
另一种方法是为模型创建一个经理类。创建一个函数以返回所需的内容,并在需要的地方调用它。
class MyModelManager(models.Manager):
def get_my_query(self, order):
#Write your query