Django: Paginator возвращает все данные из базы данных, и порядок не работает - PullRequest
1 голос
/ 16 мая 2019

У меня есть этот ListView, и я пытаюсь получить только 12 автомобилей из моей базы данных и упорядочить их по цене, у меня есть 20 записей в моей базе данных, и в кнопках нумерации страниц отображается 6 кнопок, то есть 6 страниц, так чтовозвращает все возможные данные из базы данных, в этот момент я потерян и не могу найти ошибку, любая помощь будет очень полезна как для разбивки на страницы, так и для упорядочивания.

class CardListView(ListView):
    model = Car
    template_name = 'home.html'
    context_object_name = 'cars'
    ordering = ['-price']
    paginate_by = 5
    limit = 12

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        paginator = context['paginator']
        page_numbers_range = 10 
        max_index = len(paginator.page_range)

        page = self.request.GET.get('page')
        current_page = int(page) if page else 1

        start_index = int((current_page - 1) / page_numbers_range) * page_numbers_range
        end_index = start_index + page_numbers_range
        if end_index >= max_index:
            end_index = max_index

        page_range = paginator.page_range[start_index:end_index]
        cars = Car.objects.all()[:self.limit]
        car_types = CarCategory.objects.all()

        context['cars'] = cars

        context['car_types'] = car_types
        context['page_range'] = page_range
        return context

1 Ответ

2 голосов
/ 16 мая 2019

Вам не нужно выполнять логику разбиения на страницы самостоятельно, вам нужно только реализовать в get_context_data дополнительные элементы, которые вы хотите передать в шаблон.Логика разбиения на страницы обрабатывается самой ListView .Если вы хотите ограничить набор запросов, вы должны сделать это в функции get_queryset(..) [Django-doc] :

class CardListView(ListView):
    model = Car
    template_name = 'home.html'
    context_object_name = 'cars'
    ordering = ['-price']
    paginate_by = 5
    limit = 12

    def <b>get_queryset</b>(self):
        <b>return super().get_queryset()[:self.limit]</b>

    def get_context_data(self, **kwargs):
        <b>context = super().get_context_data()</b>  # with paginated queryset
        context['car_types'] = car_types = CarCategory.objects.all()
        return context

Оригинал ListViewРеализация вызовет get_queryset, а затем передаст его соответствующему paginator.Используя super(), нам, кроме того, не нужно заботиться о ordering и т. Д. Все они обрабатываются самим ListView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...