Узнайте, как разбить на страницы в Django

Разбиение на страницы — это процесс разбиения больших блоков данных на несколько отдельных веб-страниц. Вместо того, чтобы сбрасывать все данные пользователю, вы можете определить количество отдельных записей, которые вы хотите отображать на странице, а затем отправить обратно данные, соответствующие странице, запрошенной пользователем.

Преимущество использования этого типа метода заключается в том, что он улучшает взаимодействие с пользователем, особенно когда необходимо извлечь тысячи записей. Реализовать разбиение на страницы в Django довольно просто, так как Django предоставляет класс Paginator , который вы можете использовать для группировки контента на разных страницах.

Разбивка на страницы может быть разной, в зависимости от того, как она настроена разработчиком. Тем не менее, в этой статье мы рассмотрим, как включить разбивку на страницы с функциями и представлениями на основе классов, используя три разных варианта пользовательского интерфейса.

Цели

К концу этой статьи вы сможете:

  1. Объясните, что такое нумерация страниц и почему вы можете захотеть ее использовать.
  2. Работа с Paginatorклассом и Pageобъектами Django.
  3. Реализуйте разбиение на страницы в Django с помощью функций и представлений на основе классов.

Джанго Конструкты

При реализации нумерации страниц в Django вместо того, чтобы заново изобретать логику, необходимую для нумерации страниц, вы будете работать со следующими конструкциями:

  1. Paginator — разбивает Django QuerySet или список на фрагменты Pageобъектов.
  2. Страница — содержит фактические данные с разбивкой на страницы вместе с метаданными разбивки на страницы.

Давайте посмотрим на несколько быстрых примеров.

пагинатор

from django.contrib.auth.models import User


for num in range(43):
    User.objects.create(username=f"{num}")

Здесь мы создали 43 объекта User.

Далее мы импортируем Paginatorкласс и создадим новый экземпляр:

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

print(paginator.num_pages)  # => 5

Класс Paginatorпринимает четыре параметра:

  1. object_list- любой объект с методом count()или __len__(), например, список, кортеж или QuerySet
  2. per_page- максимальное количество элементов для размещения на странице
  3. orphans(необязательно) — используется, чтобы на последней странице не было очень мало элементов, по умолчанию0
  4. allow_empty_first_page(необязательно) — как следует из названия, вы можете вызвать EmtpyPageошибку, если запретите первой странице быть пустой, установив для аргумента значение False, по умолчанию —True

Итак, в приведенном выше примере мы разделили пользователей на страницы (или фрагменты) по десять. На первых четырех страницах будет десять пользователей, а на последней — три.

Класс Paginatorимеет следующие атрибуты :

  1. count- общее количество объектов
  2. num_pages- общее количество страниц
  3. page_range- итератор диапазона номеров страниц

Для согласованных результатов с разбивкой на страницы необходимо заказать QuerySet или модель.

Если вы предпочитаете, чтобы на последней странице не было только трех пользователей, вы можете использовать аргумент orphans следующим образом, чтобы добавить последних трех пользователей на предыдущую страницу:

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10, orphans=3)

print(paginator.num_pages)  # => 4

Таким образом, когда количество оставшихся объектов для последней страницы меньше или равно значению orphans, эти объекты будут добавлены на предыдущую страницу.

Страница

После того, как Django QuerySet был разбит на Pageобъекты. Затем мы можем использовать этот page()метод для доступа к данным для каждой страницы, передав ей номер страницы:

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

page_obj = paginator.page(1)

print(page_obj)  # => <Page 1 of 5>

Здесь page_objдает нам объект страницы, который представляет первую страницу результатов. Затем это можно использовать в ваших шаблонах.

Обратите внимание, что мы не создавали Pageэкземпляр буквально. Вместо этого мы получили экземпляр из класса Paginator.

Что произойдет, если страница не существует?

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

page_obj = paginator.page(99)

Тебе следует увидеть:

    raise EmptyPage(_('That page contains no results'))
django.core.paginator.EmptyPage: That page contains no results

Таким образом, хорошей идеей будет поймать такое EmptyPageисключение:

from django.contrib.auth.models import User
from django.core.paginator import EmptyPage, Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

try:
    page_obj = paginator.page(99)
except EmptyPage:
    # Do something
    pass

Вы также можете поймать PageNotAnIntegerисключение.

Подробнее об этом читайте в разделе « Исключения » документации Paginator.

Тем не менее, если вы предпочитаете не иметь дело с исключениями EmptyPageили PageNotAnIntegerявно, вы можете использовать метод get_page() вместо page():

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

page_obj = paginator.get_page(99)

print(page_obj)  # => <Page 5 of 5>

Таким образом, даже если число 99выходит за пределы допустимого диапазона, будет возвращена последняя страница.

Кроме того, если страница не является допустимым номером get_page(), по умолчанию будет возвращена первая страница:

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

page_obj = paginator.get_page('foo')

print(page_obj)  # => <Page 1 of 5>

Таким образом, оба метода -- page()или get_page()-- могут использоваться в зависимости от ваших предпочтений. Примеры, показанные в этой статье, будут использовать page().

Объект Pageимеет несколько атрибутов и методов , которые можно использовать при создании шаблона:

  1. number- показывает номер страницы для данной страницы
  2. paginator- отображает связанный Paginatorобъект
  3. has_next()- возвращает True, если есть следующая страница
  4. has_previous()-- возвращает True, если есть предыдущая страница
  5. next_page_number()- возвращает номер следующей страницы
  6. previous_page_number()- возвращает номер предыдущей страницы

Функциональные представления

Далее давайте посмотрим, как работать с нумерацией страниц в представлениях на основе функций:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render

from . models import Employee


def index(request):
    object_list = Employee.objects.all()
    page_num = request.GET.get('page', 1)

    paginator = Paginator(object_list, 6) # 6 employees per page


    try:
        page_obj = paginator.page(page_num)
    except PageNotAnInteger:
        # if page is not an integer, deliver the first page
        page_obj = paginator.page(1)
    except EmptyPage:
        # if the page is out of range, deliver the last page
        page_obj = paginator.page(paginator.num_pages)

    return render(request, 'index.html', {'page_obj': page_obj})

Мы тут:

  1. Определена page_numпеременная из URL.
  2. Создал экземпляр Paginatorкласса, передав ему необходимые параметры, employeesQuerySet и количество сотрудников, которые будут включены на каждой странице.
  3. Создан объект страницы с именем page_obj, который содержит данные о сотрудниках с разбивкой на страницы вместе с метаданными для перехода к предыдущей и следующей страницам.

https://github.com/testdrivenio/django-pagination-example/blob/main/employees/views.py

Представления на основе классов

Пример реализации пагинации в представлении на основе классов:

from django.views.generic import ListView

from . models import Employee


class Index(ListView):
    model = Employee
    context_object_name = 'employees'
    paginate_by = 6
    template_name = 'index.html'

https://github.com/testdrivenio/django-pagination-example/blob/main/employees/views.py

Шаблоны

Работа с нумерацией страниц в шаблоне становится интересной, поскольку существует несколько различных реализаций. В этой статье мы рассмотрим три разные реализации, каждая из которых демонстрирует свой способ перехода к предыдущей и следующей страницам.

Вы можете найти код для каждого примера в папке шаблонов в репозитории django-pagination-example на GitHub.

Вкус 1

Это первая разновидность, реализующая пользовательский интерфейс с разбиением на страницы.

Интерфейс разбивки на страницы — первый вариант

Итак, в этом примере у нас есть ссылки «Предыдущая» и «Следующая», по которым конечный пользователь может переходить со страницы на страницу.

index.html :

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css">
    <title>Pagination in Django</title>
  </head>
  <body>
    <div class="container">
      <h1 class="text-center">List of Employees</h1>
      <hr>

      <ul class="list-group list-group-flush">
        {% for employee in page_obj %}
          <li class="list-group-item">{{ employee }}</li>
        {% endfor %}
      </ul>

      <br><hr>

     {% include "pagination.html" %}
    </div>
  </body>
</html>

страница.html :

<div>
  <span>
    {% if page_obj.has_previous %}
      <a href="?page={{ page_obj.previous_page_number }}">Previous</a>
    {% endif %}
    <span>
      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>
    {% endif %}
  </span>
</div>

Имейте в виду, что шаблон pagination.html можно повторно использовать во многих шаблонах.

Вкус 2

Интерфейс пагинации — второй вариант

страница.html :

{% if page_obj.has_previous %}
 <a href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% else %}
  <a>Previous</a>
{% endif %}

{% for i in page_obj.paginator.page_range %}
  {% if page_obj.number == i %}
    <a href="#">{{ i }} </a>
  {% else %}
    <a href="?page={{ i }}">{{ i }}</a>
  {% endif %}
{% endfor %}

{% if page_obj.has_next %}
  <a href="?page={{ page_obj.next_page_number }}">Next</a>
{% else %}
  <a>Next</a>
{% endif %}

Этот вариант представляет все номера страниц в пользовательском интерфейсе, что упрощает переход на разные страницы.

Вкус 3

Интерфейс разбивки на страницы — третий вариант

страница.html :

{% if page_obj.has_previous %}
  <a href="?page={{ page_obj.previous_page_number }}">« Previous page</a>

  {% if page_obj.number > 3 %}
    <a href="?page=1">1</a>
    {% if page_obj.number > 4 %}
      <span>...</span>
    {% endif %}
  {% endif %}
{% endif %}

{% for num in page_obj.paginator.page_range %}
  {% if page_obj.number == num %}
    <a href="?page={{ num }}">{{ num }}</a>
  {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
    <a href="?page={{ num }}">{{ num }}</a>
  {% endif %}
{% endfor %}

{% if page_obj.has_next %}
  {% if page_obj.number < page_obj.paginator.num_pages|add:'-3' %}
    <span>...</span>
    <a href="?page={{ page_obj.paginator.num_pages }}">{{ page_obj.paginator.num_pages }}</a>
  {% elif page_obj.number < page_obj.paginator.num_pages|add:'-2' %}
    <a href="?page={{ page_obj.paginator.num_pages }}">{{ page_obj.paginator.num_pages }}</a>
  {% endif %}

  <a href="?page={{ page_obj.next_page_number }}">Next Page »</a>
{% endif %}

Если у вас большое количество страниц, вы можете взглянуть на этот третий и последний вариант.

Вывод

На этом статья о реализации пагинации в Django заканчивается. Вот основные выводы, которые следует помнить:

  1. Реализовать разбивку на страницы в Django довольно просто благодаря встроенным вспомогательным классам и Paginator.Page
  2. После создания представления вы просто возвращаете объект страницы с данными, разбитыми на страницы, для использования в шаблоне.

Источник:  https://testdriven.io

#django 

What is GEEK

Buddha Community

Узнайте, как разбить на страницы в Django
Ahebwe  Oscar

Ahebwe Oscar

1620177818

Django admin full Customization step by step

Welcome to my blog , hey everyone in this article you learn how to customize the Django app and view in the article you will know how to register  and unregister  models from the admin view how to add filtering how to add a custom input field, and a button that triggers an action on all objects and even how to change the look of your app and page using the Django suit package let’s get started.

Database

Custom Titles of Django Admin

Exclude in Django Admin

Fields in Django Admin

#django #create super user django #customize django admin dashboard #django admin #django admin custom field display #django admin customization #django admin full customization #django admin interface #django admin register all models #django customization

Ahebwe  Oscar

Ahebwe Oscar

1620185280

How model queries work in Django

How model queries work in Django

Welcome to my blog, hey everyone in this article we are going to be working with queries in Django so for any web app that you build your going to want to write a query so you can retrieve information from your database so in this article I’ll be showing you all the different ways that you can write queries and it should cover about 90% of the cases that you’ll have when you’re writing your code the other 10% depend on your specific use case you may have to get more complicated but for the most part what I cover in this article should be able to help you so let’s start with the model that I have I’ve already created it.

**Read More : **How to make Chatbot in Python.

Read More : Django Admin Full Customization step by step

let’s just get into this diagram that I made so in here:

django queries aboutDescribe each parameter in Django querset

we’re making a simple query for the myModel table so we want to pull out all the information in the database so we have this variable which is gonna hold a return value and we have our myModel models so this is simply the myModel model name so whatever you named your model just make sure you specify that and we’re gonna access the objects attribute once we get that object’s attribute we can simply use the all method and this will return all the information in the database so we’re gonna start with all and then we will go into getting single items filtering that data and go to our command prompt.

Here and we’ll actually start making our queries from here to do this let’s just go ahead and run** Python manage.py shell** and I am in my project file so make sure you’re in there when you start and what this does is it gives us an interactive shell to actually start working with our data so this is a lot like the Python shell but because we did manage.py it allows us to do things a Django way and actually query our database now open up the command prompt and let’s go ahead and start making our first queries.

#django #django model queries #django orm #django queries #django query #model django query #model query #query with django

Узнайте, как разбить на страницы в Django

Разбиение на страницы — это процесс разбиения больших блоков данных на несколько отдельных веб-страниц. Вместо того, чтобы сбрасывать все данные пользователю, вы можете определить количество отдельных записей, которые вы хотите отображать на странице, а затем отправить обратно данные, соответствующие странице, запрошенной пользователем.

Преимущество использования этого типа метода заключается в том, что он улучшает взаимодействие с пользователем, особенно когда необходимо извлечь тысячи записей. Реализовать разбиение на страницы в Django довольно просто, так как Django предоставляет класс Paginator , который вы можете использовать для группировки контента на разных страницах.

Разбивка на страницы может быть разной, в зависимости от того, как она настроена разработчиком. Тем не менее, в этой статье мы рассмотрим, как включить разбивку на страницы с функциями и представлениями на основе классов, используя три разных варианта пользовательского интерфейса.

Цели

К концу этой статьи вы сможете:

  1. Объясните, что такое нумерация страниц и почему вы можете захотеть ее использовать.
  2. Работа с Paginatorклассом и Pageобъектами Django.
  3. Реализуйте разбиение на страницы в Django с помощью функций и представлений на основе классов.

Джанго Конструкты

При реализации нумерации страниц в Django вместо того, чтобы заново изобретать логику, необходимую для нумерации страниц, вы будете работать со следующими конструкциями:

  1. Paginator — разбивает Django QuerySet или список на фрагменты Pageобъектов.
  2. Страница — содержит фактические данные с разбивкой на страницы вместе с метаданными разбивки на страницы.

Давайте посмотрим на несколько быстрых примеров.

пагинатор

from django.contrib.auth.models import User


for num in range(43):
    User.objects.create(username=f"{num}")

Здесь мы создали 43 объекта User.

Далее мы импортируем Paginatorкласс и создадим новый экземпляр:

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

print(paginator.num_pages)  # => 5

Класс Paginatorпринимает четыре параметра:

  1. object_list- любой объект с методом count()или __len__(), например, список, кортеж или QuerySet
  2. per_page- максимальное количество элементов для размещения на странице
  3. orphans(необязательно) — используется, чтобы на последней странице не было очень мало элементов, по умолчанию0
  4. allow_empty_first_page(необязательно) — как следует из названия, вы можете вызвать EmtpyPageошибку, если запретите первой странице быть пустой, установив для аргумента значение False, по умолчанию —True

Итак, в приведенном выше примере мы разделили пользователей на страницы (или фрагменты) по десять. На первых четырех страницах будет десять пользователей, а на последней — три.

Класс Paginatorимеет следующие атрибуты :

  1. count- общее количество объектов
  2. num_pages- общее количество страниц
  3. page_range- итератор диапазона номеров страниц

Для согласованных результатов с разбивкой на страницы необходимо заказать QuerySet или модель.

Если вы предпочитаете, чтобы на последней странице не было только трех пользователей, вы можете использовать аргумент orphans следующим образом, чтобы добавить последних трех пользователей на предыдущую страницу:

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10, orphans=3)

print(paginator.num_pages)  # => 4

Таким образом, когда количество оставшихся объектов для последней страницы меньше или равно значению orphans, эти объекты будут добавлены на предыдущую страницу.

Страница

После того, как Django QuerySet был разбит на Pageобъекты. Затем мы можем использовать этот page()метод для доступа к данным для каждой страницы, передав ей номер страницы:

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

page_obj = paginator.page(1)

print(page_obj)  # => <Page 1 of 5>

Здесь page_objдает нам объект страницы, который представляет первую страницу результатов. Затем это можно использовать в ваших шаблонах.

Обратите внимание, что мы не создавали Pageэкземпляр буквально. Вместо этого мы получили экземпляр из класса Paginator.

Что произойдет, если страница не существует?

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

page_obj = paginator.page(99)

Тебе следует увидеть:

    raise EmptyPage(_('That page contains no results'))
django.core.paginator.EmptyPage: That page contains no results

Таким образом, хорошей идеей будет поймать такое EmptyPageисключение:

from django.contrib.auth.models import User
from django.core.paginator import EmptyPage, Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

try:
    page_obj = paginator.page(99)
except EmptyPage:
    # Do something
    pass

Вы также можете поймать PageNotAnIntegerисключение.

Подробнее об этом читайте в разделе « Исключения » документации Paginator.

Тем не менее, если вы предпочитаете не иметь дело с исключениями EmptyPageили PageNotAnIntegerявно, вы можете использовать метод get_page() вместо page():

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

page_obj = paginator.get_page(99)

print(page_obj)  # => <Page 5 of 5>

Таким образом, даже если число 99выходит за пределы допустимого диапазона, будет возвращена последняя страница.

Кроме того, если страница не является допустимым номером get_page(), по умолчанию будет возвращена первая страница:

from django.contrib.auth.models import User
from django.core.paginator import Paginator

users = User.objects.all()

paginator = Paginator(users, 10)

page_obj = paginator.get_page('foo')

print(page_obj)  # => <Page 1 of 5>

Таким образом, оба метода -- page()или get_page()-- могут использоваться в зависимости от ваших предпочтений. Примеры, показанные в этой статье, будут использовать page().

Объект Pageимеет несколько атрибутов и методов , которые можно использовать при создании шаблона:

  1. number- показывает номер страницы для данной страницы
  2. paginator- отображает связанный Paginatorобъект
  3. has_next()- возвращает True, если есть следующая страница
  4. has_previous()-- возвращает True, если есть предыдущая страница
  5. next_page_number()- возвращает номер следующей страницы
  6. previous_page_number()- возвращает номер предыдущей страницы

Функциональные представления

Далее давайте посмотрим, как работать с нумерацией страниц в представлениях на основе функций:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render

from . models import Employee


def index(request):
    object_list = Employee.objects.all()
    page_num = request.GET.get('page', 1)

    paginator = Paginator(object_list, 6) # 6 employees per page


    try:
        page_obj = paginator.page(page_num)
    except PageNotAnInteger:
        # if page is not an integer, deliver the first page
        page_obj = paginator.page(1)
    except EmptyPage:
        # if the page is out of range, deliver the last page
        page_obj = paginator.page(paginator.num_pages)

    return render(request, 'index.html', {'page_obj': page_obj})

Мы тут:

  1. Определена page_numпеременная из URL.
  2. Создал экземпляр Paginatorкласса, передав ему необходимые параметры, employeesQuerySet и количество сотрудников, которые будут включены на каждой странице.
  3. Создан объект страницы с именем page_obj, который содержит данные о сотрудниках с разбивкой на страницы вместе с метаданными для перехода к предыдущей и следующей страницам.

https://github.com/testdrivenio/django-pagination-example/blob/main/employees/views.py

Представления на основе классов

Пример реализации пагинации в представлении на основе классов:

from django.views.generic import ListView

from . models import Employee


class Index(ListView):
    model = Employee
    context_object_name = 'employees'
    paginate_by = 6
    template_name = 'index.html'

https://github.com/testdrivenio/django-pagination-example/blob/main/employees/views.py

Шаблоны

Работа с нумерацией страниц в шаблоне становится интересной, поскольку существует несколько различных реализаций. В этой статье мы рассмотрим три разные реализации, каждая из которых демонстрирует свой способ перехода к предыдущей и следующей страницам.

Вы можете найти код для каждого примера в папке шаблонов в репозитории django-pagination-example на GitHub.

Вкус 1

Это первая разновидность, реализующая пользовательский интерфейс с разбиением на страницы.

Интерфейс разбивки на страницы — первый вариант

Итак, в этом примере у нас есть ссылки «Предыдущая» и «Следующая», по которым конечный пользователь может переходить со страницы на страницу.

index.html :

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css">
    <title>Pagination in Django</title>
  </head>
  <body>
    <div class="container">
      <h1 class="text-center">List of Employees</h1>
      <hr>

      <ul class="list-group list-group-flush">
        {% for employee in page_obj %}
          <li class="list-group-item">{{ employee }}</li>
        {% endfor %}
      </ul>

      <br><hr>

     {% include "pagination.html" %}
    </div>
  </body>
</html>

страница.html :

<div>
  <span>
    {% if page_obj.has_previous %}
      <a href="?page={{ page_obj.previous_page_number }}">Previous</a>
    {% endif %}
    <span>
      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>
    {% endif %}
  </span>
</div>

Имейте в виду, что шаблон pagination.html можно повторно использовать во многих шаблонах.

Вкус 2

Интерфейс пагинации — второй вариант

страница.html :

{% if page_obj.has_previous %}
 <a href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% else %}
  <a>Previous</a>
{% endif %}

{% for i in page_obj.paginator.page_range %}
  {% if page_obj.number == i %}
    <a href="#">{{ i }} </a>
  {% else %}
    <a href="?page={{ i }}">{{ i }}</a>
  {% endif %}
{% endfor %}

{% if page_obj.has_next %}
  <a href="?page={{ page_obj.next_page_number }}">Next</a>
{% else %}
  <a>Next</a>
{% endif %}

Этот вариант представляет все номера страниц в пользовательском интерфейсе, что упрощает переход на разные страницы.

Вкус 3

Интерфейс разбивки на страницы — третий вариант

страница.html :

{% if page_obj.has_previous %}
  <a href="?page={{ page_obj.previous_page_number }}">« Previous page</a>

  {% if page_obj.number > 3 %}
    <a href="?page=1">1</a>
    {% if page_obj.number > 4 %}
      <span>...</span>
    {% endif %}
  {% endif %}
{% endif %}

{% for num in page_obj.paginator.page_range %}
  {% if page_obj.number == num %}
    <a href="?page={{ num }}">{{ num }}</a>
  {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
    <a href="?page={{ num }}">{{ num }}</a>
  {% endif %}
{% endfor %}

{% if page_obj.has_next %}
  {% if page_obj.number < page_obj.paginator.num_pages|add:'-3' %}
    <span>...</span>
    <a href="?page={{ page_obj.paginator.num_pages }}">{{ page_obj.paginator.num_pages }}</a>
  {% elif page_obj.number < page_obj.paginator.num_pages|add:'-2' %}
    <a href="?page={{ page_obj.paginator.num_pages }}">{{ page_obj.paginator.num_pages }}</a>
  {% endif %}

  <a href="?page={{ page_obj.next_page_number }}">Next Page »</a>
{% endif %}

Если у вас большое количество страниц, вы можете взглянуть на этот третий и последний вариант.

Вывод

На этом статья о реализации пагинации в Django заканчивается. Вот основные выводы, которые следует помнить:

  1. Реализовать разбивку на страницы в Django довольно просто благодаря встроенным вспомогательным классам и Paginator.Page
  2. После создания представления вы просто возвращаете объект страницы с данными, разбитыми на страницы, для использования в шаблоне.

Источник:  https://testdriven.io

#django 

joe biden

1615787193

Kонвертер MBOX в PST - Бесплатный MBOX в PST для конвертации файла MBOX в файл PST

Descargue el MBOX al convertidor PST y convierta los archivos MBOX al formato PST. Con esta aplicación, los archivos se convierten a gran velocidad sin ningún problema. Para conocer la aplicación el usuario puede instalar la versión demo de esta aplicación y así conocer la aplicación y su funcionamiento. Con una alta velocidad de compatibilidad, la aplicación convierte todos los archivos MBOX en formato PST.

Conozca el funcionamiento de la aplicación.

Esta aplicación avanzada funciona en un orden específico para convertir los archivos MBOX a formato PST. Por lo tanto, a continuación se muestran algunos de los puntos que hablan sobre la aplicación y ver si la aplicación cumple con todas las expectativas del usuario.

  • Los usuarios pueden convertir archivos MBOX a granel y sin problemas.
  • Con la ubicación especificada por el usuario, los datos se convierten rápidamente.
  • La aplicación proporciona una conversión directa.
  • De forma avanzada, se realiza el proceso de conversión.
  • La aplicación proporciona una conversión rápida con solo un clic.
  • La aplicación funciona en cualquier aplicación de Windows, incluidos XP o Vista.
  • Cualquier archivo MBOX de correo electrónico se convierte en este convertidor inteligente.
  • La aplicación guarda el archivo localmente.

Por lo tanto, la aplicación ofrece estas funciones avanzadas que permiten que el software funcione de manera avanzada.

¿Cómo convertir archivos MBOX a PST?

Los usuarios pueden convertir el archivo en unos pocos pasos sin asistencia técnica. Siga estos pasos para convertir su archivo MBOX al formato PST de Outlook:

Paso 1: descargue el convertidor MBOX a PST
Paso 2- Inicie el convertidor
Paso 3- Seleccione los archivos MBOX que desea convertir
Paso 4- Ahora, elija el tipo que desea exportar los archivos.
Paso 5- Elija la ubicación donde desea guardar el archivo
Paso 6- Finalmente, haga clic derecho en el botón “Convertir ahora”.

Estos pasos pueden ser realizados por cualquier usuario novato.

Algunos de los atributos de este convertidor inteligente

Analicemos las funciones inteligentes de este convertidor que se indican a continuación:

  1. Convierta cualquier archivo MBOX

Esta herramienta convierte archivos MBOX de cualquier tipo desde Thunderbird a Apple Mail. Este es un convertidor avanzado.

  1. Conversión masiva de archivos MBOX

Los usuarios pueden convertir cualquier cantidad de archivos de datos sin ningún obstáculo. No importa cuál sea el tamaño del archivo MBOX, la conversión procede.

  1. Solo se convierten los archivos seleccionados

Los archivos que selecciona el usuario se convierten de archivos MBOX al formato PST de Outlook. Los resultados convertidos son los deseados por los usuarios.

  1. Ubicación personalizada

El usuario puede guardar el archivo en cualquier ubicación donde el usuario quiera guardarlo. En una ubicación adecuada, se guardan los datos convertidos.

  1. Buena compatibilidad

El usuario proporciona una interfaz fácil de usar que ayuda al usuario a convertir los archivos sin problemas y sin ningún obstáculo.

  1. Excelente precisión

El resultado proporcionado por la aplicación es 100% exacto. La calidad del resultado sigue siendo impecable.

Conclusión

La aplicación da todos los resultados adecuados después de la conversión. Con una alta velocidad de compatibilidad, la tarea de conversión es procesada por la aplicación sin ningún error. Descargue la versión de demostración gratuita del convertidor MBOX a PST para ver si funciona.

Más información:- https://www.datavare.com/ru/конвертер-mbox-в-pst.html

#конвертер mbox в pst #mbox в импортер pst #преобразование mbox в pst #mbox в экспортер pst #конвертировать mbox в pst #импортировать mbox в pst

Ananya Gupta

Ananya Gupta

1597123834

Main Pros and Cons of Django As A Web Framework for Python Developers

Django depicts itself as “the web system for fussbudgets with cutoff times”. It was intended to help Python engineers take applications from idea to consummation as fast as could be expected under the circumstances.

It permits fast turn of events on the off chance that you need to make a CRUD application with batteries included. With Django, you won’t need to rehash an already solved problem. It just works and lets you center around your business rationale and making something clients can utilize.

Pros of Django

“Batteries included” theory

The standard behind batteries-included methods normal usefulness for building web applications accompanies the system, not as isolated libraries.

Django incorporates much usefulness you can use to deal with normal web advancement undertakings. Here are some significant level functionalities that Django gives you, which else you need to stay together if you somehow happened to utilize a small scale structure:

ORM

Database relocations

Client validation

Administrator board

Structures

Normalized structure

Django as a system proposes the right structure of an undertaking. That structure helps designers in making sense of how and where to execute any new component.

With a generally acknowledged venture structure that is like numerous tasks, it is a lot simpler to discover online good arrangements or approach the network for help. There are numerous energetic Python designers who will assist you with comprehending any issue you may experience.

Django applications

Django applications (or applications for short) permit designers to separate a task into numerous applications. An application is whatever is introduced by putting in settings.INSTALLED_APPS. This makes it simpler for engineers to add usefulness to the web application by coordinating outer Django applications into the venture.

There are many reusable modules and applications to accelerate your turn of events learn through Online Django Class and Check the Django website.

Secure of course

Django gives great security assurance out of the crate and incorporates avoidance components for basic assaults like SQL Injection (XSS) and Cross-site Request Forgery (CSRF). You can discover more subtleties in the official security diagram control.

REST structure for building APIs

Django REST Framework, commonly condensed “DRF”, is a Python library for building APIs. It has secluded and adaptable engineering that functions admirably for both straightforward and complex web APIs.

DRF gives a lot of verification and authorization strategies out of the case. It is an adaptable, full-included library with measured and adjustable engineering. It accompanies nonexclusive classes for CRUD tasks and an implicit API program for testing API endpoints.

GraphQL structure for building APIs

Huge REST APIs regularly require a lot of solicitations to various endpoints to recover every single required datum. GraphQL it’s a question language that permits us to share related information in a lot simpler design. For a prologue to GraphQL and an outline of its ideas, if it’s not too much trouble allude to the authority GraphQL documentation.

Graphene-Django gives reflections that make it simple to add GraphQL usefulness to your Django venture. Ordinary Django models, structures, validation, consent arrangements, and different functionalities can be reused to manufacture GraphQL blueprint. It additionally gives an implicit API program for testing API endpoints.

Cons of Django

Django ORM

Django ORM, made before SQLAlchemy existed, is currently much sub-par compared to SQLAlchemy. It depends on the Active Record design which is more regrettable than the Unit of Work design embraced by SQLAlchemy. This implies, in Django, models can “spare” themselves and exchanges are off as a matter of course, they are a bit of hindsight. Peruse more in Why I kind of aversion Django.

Django advances course popularity increses day by day:

Django is huge and is viewed as strong bit of programming. This permits the network to create several reusable modules and applications yet has additionally restricted the speed of advancement of the Django. On head of that Django needs to keep up in reverse similarity, so it advances gradually.

Rundown - Should I use Django as a Python designer?

While Django ORM isn’t as adaptable as SQLAlchemy and the enormous environment of reusable modules and applications hinders structure advancement - plainly Django ought to be the best option web system for Python engineers.

Elective, light systems, similar to Flask, while offering a retreat from Django huge biological system and designs, in the long haul can require substantially more additional libraries and usefulness, in the end making many experienced Python engineers winding up wishing they’d began with Django.

Django undertaking’s security and network have become enormously over the previous decade since the system’s creation. Official documentation and instructional exercises are probably the best anyplace in programming advancement. With each delivery, Django keeps on including huge new usefulness.

#django online training #django online course #online django course #django course #django training #django certification course