Пагинация в Django - объединение двух проектов
Я работаю над двумя разными проектами. У меня есть «Пример на 5» и серия YT, которую я ранее использовал для начала работы с Django. Мне понравилась пагинация из серии YT, поэтому я решил использовать этот метод, однако в процессе работы над примером мы перешли от базового представления Class к функции, и теперь пагинация не отображается. Я добавил все, что считал нужным, в представление и html-страницу, но все равно ничего не получил.
Просмотр кода:
def post_list(request, tag_slug=None):
post_list = Post.published.all()
tag = None
if tag_slug:
tag = get_object_or_404(Tag, slug=tag_slug)
post_list = post_list.filter(tags__in=[tag])
paginator = Paginator(post_list, 3) # 3 posts in each page
page_number = request.GET.get('page') # Get the page number
page_obj = paginator.get_page(page_number)
context = {'page_obj': page_obj,'is_paginated': page_obj.has_other_pages()} # Check if pagination is needed
try:
posts = paginator.page(page_number)
except PageNotAnInteger:
posts = paginator.page(1)
except EmptyPage:
posts = paginator.page(paginator.num_pages)
return render(request, 'blog/post/list.html', {'posts': posts, 'context' : context, 'tag': tag})
Здесь находится раздел Pagination в html:
{% if is_paginated %}
{% if page_obj.has_previous %}
<a class="btn btn-outline-info mb-4" href="?page=1">First</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% endif %}
{% for num in page_obj.paginator.page_range %}
{% if page_obj.number == num %}
<a class="btn btn-info mb-4" href="?page={{ num }}">{{ num }}</a>
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
<a class="btn btn-outline-info mb-4" href="?page={{ num }}">{{ num }}</a>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Next</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.paginator.num_pages }}">Last</a>
{% endif %}
{% endif %}
Вы создаете словарь context
, но затем используете posts
в вызове рендеринга.
Вам следует объединить все в один контекст. Используйте page_obj
вместо posts
:
return render(request, 'blog/post/list.html', {'page_obj': page_obj, 'tag': tag})
В вашем шаблоне измените проверку is_paginated
, чтобы использовать page_obj
напрямую:
{% if page_obj.has_other_pages %}
{% if page_obj.has_previous %}
<a class="btn btn-outline-info mb-4" href="?page=1">First</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% endif %}
{% for num in page_obj.paginator.page_range %}
{% if page_obj.number == num %}
<a class="btn btn-info mb-4" href="?page={{ num }}">{{ num }}</a>
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
<a class="btn btn-outline-info mb-4" href="?page={{ num }}">{{ num }}</a>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Next</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.paginator.num_pages }}">Last</a>
{% endif %}
{% endif %}