@serhiops
Python/JavaScript/C++

Как сделать пагинацию в джанго?

Вроде, все делаю по документации, но ничего не получается. Отображается сама html-форма, но она не работает.
views
def about_user(request,user_slug):
    curent_user = get_object_or_404(User, username = user_slug)
    user_posts = curent_user.blog_posts.all()
    categories = Category.objects.annotate(cnt=Count('get_news')).filter(cnt__gt=0)
    
    paginator = Paginator(user_posts, 3)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    try:
        about_user = AboutUser.objects.get(author = curent_user.id)
        context = {
            'username':curent_user,
            'categories':categories, 
            'user_posts':user_posts,
            'side':1,
            'about_user':about_user,
            'page_obj': page_obj,
            }
    except:
        context = {
            'username':curent_user,
            'categories':categories, 
            'user_posts':user_posts,
            'side':1,
            'page_obj': page_obj,
            }

    return render(request, 'news/about_user.html',context)
template
{% extends 'news/base.html' %}

{% block title %}{% if user == username %}Моя сторінка{% else %} Сторінка користувача: {{ username.username }}{% endif%}{% endblock %}



{% block content %}
{% if about_user.avatar %}

  <img src="{{about_user.avatar.url}}" alt="Изображение" style="float:left;margin: 5px 17px 7px 0;" width = 400 height="385">

<ul class="list-group">
  {% endif %}
  <li class="list-group-item"><b>Username:</b> {{ username.username }}</li>
  <li class="list-group-item"><b>Ім'я:</b> {{ username.first_name }}</li>
  <li class="list-group-item"><b>Прізвиcько:</b> {{ username.last_name }}</li>
  <li class="list-group-item"><b>Зареєструвався:</b> {{ username.date_joined|date:'Y.m.d' }}</li>
  <li class="list-group-item"><b>Останній раз був онлайн:</b> {{ username.last_login|timesince }} ago</li>
{% if about_user.country  %}
  <li class="list-group-item"><b>Країна:</b> {{ about_user.country }}</li>
  {% endif %}
  {% if about_user.city  %}
  <li class="list-group-item"><b>Місто:</b> {{ about_user.city }}</li>
  {% endif %}
  {% if about_user.age %}
  <li class="list-group-item"><b>Вік:</b> {{ about_user.age }}</li>
  {% endif %}
  {% if about_user.about_user %}
  <li class="list-group-item"><b>Про користувача:</b> {{ about_user.about_user }}</li>
  {% endif %}
  {% if about_user.link %}
  <li class="list-group-item"><b>Посилання:</b> <a href="{{ about_user.link }}">{{ about_user.link }}</a></li>
  {% endif %}
<br>
</ul>

{% if user == username %}
{% if about_user  %}

{% else %}
<p><a href="{% url 'add_aboutuser' username.username %}"><button type="button" class="btn btn-success">Додати
      ще</button></a>
{% endif %}
      {% if about_user %}
      
<p><a href="{% url 'update_addaboutuser' about_user.id %}"><button type="button"
      class="btn btn-warning">Редагувати</button></a></p>
      {% endif %}
{% endif %}


<br>

{% if user_posts %}
{% if user == username %}
<p><b>Ваші публикації:</b></p>
{% else %}
<p><b>Публикації, які опублікував {{ username.username }}:</b></p>
{% endif %}

{% for i in user_posts %}




<div class="card-mb-3">
  <div class="card-header">
    Категорія: <a href="{{ i.category.get_absolute_url }}">{{i.category}}</a>
  </div>
  <div class="card-body">
    <div class="media">
      {% if i.photo %}
      <img src="{{i.photo.url}}" alt="Изображение" width='350' height="215" style="float:left;margin: 5px 17px 7px 0;">
      {% else %}
      <img src="https://picsum.photos/350/235?grayscale" alt="Изображение" style="float:left;margin: 7px 17px 22px 0;">
      {% endif %}
    </div>
    <div class="media-body">
      {% autoescape off %}
      <h5 class="card-title">{{ i.title|escape }}</h5>
      <p class="card-text">{{ i.content|linebreaks|truncatewords:125 }}</p>
      {% endautoescape %}
      <p style="float:left; width:50%"><a href="{{ i.get_absolute_url }}" class="btn btn-primary">Read more...</a></p>

      <p style="text-align:right;"><b>{{ i.created_at|date:'Y.m.d | H:i' }}</b></p>
    </div>
  </div>

  {% endfor %}
  {% else %}
  {% if user == username%}
  <p>Ви покищо нічого не опублікували. Зробіть це! <a href="{% url 'add_new' %}"><button type="button"
        class="btn btn-success" style="margin: 10px; ;">Створити публікацію</button></a></p>
  {% endif %}
  {% endif %}
</div>


<!--Вот тут начинается пагинация-->
<div class="pagination">
  <span class="step-links">
      {% if page_obj.has_previous %}
          <a href="?page=1">&laquo; first</a>
          <a href="?page={{ page_obj.previous_page_number }}">previous</a>
      {% endif %}

      <span class="current">
          Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
      </span>

      {% if page_obj.has_next %}
          <a href="?page={{ page_obj.next_page_number }}">next</a>
          <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
      {% endif %}
  </span>
</div>
{% endblock %}

Я вставил полностью html, потому что класс пагинации конфликтует с другими запросами с БД (или что-то того).
  • Вопрос задан
  • 180 просмотров
Пригласить эксперта
Ответы на вопрос 1
exibite777
@exibite777
Ведущий системный аналитик
Теоретические основы пагинации подсказывают следующий алгоритм:
1. Получить список идентификаторов по заданным параметрам
2. Осуществить пагинацию
3. Собрать модель данных

Примерно так:
Пример кода из views.py
from django.core.paginator import Paginator
====================================
# получаем список pub_id по параметрам
    pubidlist=get_pub_id_by_params(cat_id=set(cat_id), tag=set(tag),
                    order=order, direction=direction)
# осуществляем пагинацию
    paginator = Paginator(pubidlist, size)
    if page>paginator.num_pages:
        if template=="ajaxMorePub.html":
            return render(request, "emptypublist.html")
        page=paginator.num_pages
    pubidlist = paginator.get_page(page) 
# запрашиваем модель данных 
    pubmodel=get_pub_model(pubidlist,
        order=order, direction=direction)
====================================
    response = render(request, template, {
            'pub_sorted': pubmodel.items(),
            'order': order, 'size': size, 'direction': direction,
            'page_range': paginator.page_range,
            'num_pages': paginator.num_pages,
            'paginator': paginator.page(page),
            'page': page
        })

Пример кода в шаблоне
{% if pub_sorted|length != 0 %}
<nav aria-label="pagination">
   <ul class="pagination justify-content-center">
      <!-- Первая страница --> 
      <li class="page-item {% if page == 1 %}disabled{% endif %}"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page=1&size={{ size }}&order={{ order }}&direction={{ direction }}">Первая</a> </li>
      <!-- Если существует предыдущая страница --> {% if paginator.has_previous %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ paginator.previous_page_number }}&size={{ size }}&order={{ order }}&direction={{ direction }}">«</a> </li>
      {% else %} <li class="page-item disabled"> <a class="page-link" href="#">«</a> </li>
      {% endif %} <!-- Если нет страницы +1, но есть страница -6 --> {% if page|add:"1" not in page_range and page|add:"-6" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"-6" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"-6" }}</a> </li>
      {% endif %} <!-- Если нет страницы +2, но есть страница -5 --> {% if page|add:"2" not in page_range and page|add:"-5" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"-5" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"-5" }}</a> </li>
      {% endif %} <!-- Если нет страницы +3, но есть страница -4 --> {% if page|add:"3" not in page_range and page|add:"-4" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"-4" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"-4" }}</a> </li>
      {% endif %} <!-- Если существует страница текущая - 3 --> {% if page|add:"-3" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"-3" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"-3" }}</a> </li>
      {% endif %} <!-- Если существует страница текущая - 2 --> {% if page|add:"-2" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"-2" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"-2" }}</a> </li>
      {% endif %} <!-- Если существует страница текущая - 1 --> {% if page|add:"-1" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"-1" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"-1" }}</a> </li>
      {% endif %} <!-- Текущая активная страница --> 
      <li class="page-item active"> <a class="page-link" href="#">{{ page }}</a> </li>
      <!-- Если существует страница текущая + 1 --> {% if page|add:"1" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"1" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"1" }}</a> </li>
      {% endif %} <!-- Если существует страница текущая + 2 --> {% if page|add:"2" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"2" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"2" }}</a> </li>
      {% endif %} <!-- Если существует страница текущая + 3 --> {% if page|add:"3" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"3" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"3" }}</a> </li>
      {% endif %} <!-- Если нет страницы -3, но есть страница +4 --> {% if page|add:"-3" not in page_range and page|add:"4" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"4" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"4" }}</a> </li>
      {% endif %} <!-- Если нет страницы -2, но есть страница +5 --> {% if page|add:"-2" not in page_range and page|add:"5" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"5" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"5" }}</a> </li>
      {% endif %} <!-- Если нет страницы -1, но есть страница +6 --> {% if page|add:"-1" not in page_range and page|add:"6" in page_range %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ page|add:"6" }}&size={{ size }}&order={{ order }}&direction={{ direction }}">{{ page|add:"6" }}</a> </li>
      {% endif %} <!-- Если существует следующая страница --> {% if paginator.has_next %} 
      <li class="page-item"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ paginator.next_page_number }}&size={{ size }}&order={{ order }}&direction={{ direction }}">»</a> </li>
      {% else %} 
      <li class="page-item disabled"> <a class="page-link" href="#">»</a> </li>
      {% endif %} <!-- Последняя страница --> 
      <li class="page-item {% if page == num_pages %}disabled{% endif %}"> <a class="page-link" href="/mytestblog/publication/?cat={{ cat_id_join }}{% if tag.0 != "" %}&tag={{ tagstr_param }}{% endif %}&page={{ num_pages }}&size={{ size }}&order={{ order }}&direction={{ direction }}">Последняя</a> </li>
   </ul>
</nav>
{% endif %}
Как это будет работать оставлю вам поразмышлять
в качестве домашнего задания
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы