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 }}&amp;{{ 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, и таким образом может способствовать раскрытию данных, которые вы хотите скрыть.

Вернуться на верх