Тут написано, как правильно собрать пагинацию. Смысл в том, что сам список "Product" должен участвовать в переходе между страницами. А тут связи нет.
Как у меня получилось:
views.pydef product_list(request)
category = None
categories = Category.objects.all()
products = Product.objects.filter(available=True)
paginator = Paginator(products, 3) # 12 posts in each page
page = request.GET.get('page')
if category_slug:
category = get_object_or_404(Category, slug=category_slug)
products = products.filter(category=category)
try:
products = paginator.page(page)
except PageNotAnInteger:
products = paginator.page(1)
except EmptyPage:
products = paginator.page(paginator.num_pages)
return render(request,
'products/list.html',
{'category': category,
'categories': categories,
'products': products
'page', page})
В месте где будет выдаваться блок:
main.html{% for product in products %}
{% endfor %}
{% include "shop/pagination.html" with page=products %}
И в шаблоне pagination.html:
pagination.html<div class="pagination">
<span class="step-links">
{% if page.has_previous %}
<a href="?page={{ products.previous_page_number }}">Назад</a>
{% endif %}
<span class="current">
Страница {{ products.number }} из {{ products.paginator.num_pages }}.
</span>
{% if page.has_next %}
<a href="?page={{ products.next_page_number }}">Вперед</a>
{% endif %}
</span>
</div>
Мое первое объяснение))
Виталий выше правильно написал, только чтобы понять, пришлось перелопатить документацию, по ссылке выше.
Чтобы работали страницы в категориях, надо все запихать в if
views.pyif category_slug:
category = get_object_or_404(Category, slug=category_slug)
products = products.filter(category=category)
paginator = Paginator(products, 3) # 12 posts in each page
page = request.GET.get('page')
try:
products = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer deliver the first page
products = paginator.page(1)
except EmptyPage:
# If page is out of range deliver last page of results
products = paginator.page(paginator.num_pages)