Django Paginating и order_by одновременно
class QueryLists(LoginRequiredMixin, ListView):
paginate_by=4
def get_queryset(self):
queryset=super().get_queryset()
queryset=queryset.filter(user=self.request.user)
search_filter=self.request.GET.get("search-area")
if search_filter:
queryset=queryset.filter(name__icontains=search_filter)
order_filter=self.request.GET.get("order-by")
if order_filter:
queryset=queryset.order_by(order_filter)
return queryset
def get_context_data(self, **kwargs):
context=super().get_context_data(**kwargs)
get_copy=self.request.GET.copy()
if 'page' in get_copy:
print("hello")
get_copy.pop('page')
context['get_copy']=urlencode(get_copy)
return context
Я написал этот код и url не появляется на странице, когда я перехожу на другую страницу во второй или третий раз, как это /?page=1&page=2 Я хочу, чтобы страница появлялась только один раз. Как я могу это решить?
Проблема не в копировании, вы просто продолжаете работать со старым объектом QueryDict
, поэтому:
<a href="?page={{ page_obj.previous_page_number }}&{{ get_copy }}">Previous</a>
Разумеется, представление должно использовать полный контекст, поэтому:
class QueryLists(LoginRequiredMixin, ListView):
paginate_by = 4
def get_queryset(self):
queryset = super().get_queryset()
queryset = queryset.filter(user=self.request.user)
search_filter = self.request.GET.get('search-area')
if search_filter:
queryset = queryset.filter(name__icontains=search_filter)
order_filter = self.request.GET.get('order-by')
if order_filter:
queryset = queryset.order_by(order_filter)
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
get_copy = self.request.GET.copy()
get_copy.pop('page', None)
context['get_copy'] = get_copy.urlencode()
return context
Примечание: Пожалуйста, не разрешайте заказывать по произвольному полю, это дает возможность людям получить конфиденциальные данные, например, при заказе по
author__secret
, и таким образом может способствовать раскрытию данных, которые вы хотите скрыть.