Тэги¶
Теги выглядят так: . Теги более сложны, чем переменные: некоторые создают текст в выходных данных, некоторые управляют потоком, выполняя циклы или логику, а некоторые загружают внешнюю информацию в шаблон для использования последующими переменными.
Для некоторых тегов требуются начальные и конечные теги (например, ).
Django поставляется с двумя десятками встроенных тегов шаблонов. Вы можете прочитать все о них в справочнике по встроенным тегам <ref-templates-builtins-tags>. Чтобы дать вам представление о том, что доступно, вот некоторые из наиболее часто используемых тегов:
-
Перебераеи каждый элемент в массиве. Например, чтобы отобразить список спортсменов, представленный в :
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
- , , и
-
Оценивает переменную, и если эта переменная имеет значение «true», отображается содержимое блока:
{% if athlete_list %} Number of athletes: {{ athlete_list|length }} {% elif athlete_in_locker_room_list %} Athletes should be out of the locker room soon! {% else %} No athletes. {% endif %}
В приведенном выше примере, если не пуст, количество спортсменов будет отображаться переменной . В противном случае, если не пуст, будет отображено сообщение «Athletes should be out…». Если оба списка пусты, будет отображаться «No athletes.».
Вы также можете использовать фильтры и различные операторы в теге :
{% if athlete_list|length > 1 %} Team: {% for athlete in athlete_list %} ... {% endfor %} {% else %} Athlete: {{ athlete_list.0.name }} {% endif %}
Хотя приведенный выше пример работает, имейте в виду, что большинство шаблонных фильтров возвращают строки, поэтому математические сравнения с использованием фильтров обычно не работают так, как вы ожидаете. является исключением.
- и
- Настройте (смотрите ниже), мощный способ сократить количество лишних повторений в шаблонах.
Опять же, приведенное выше — это лишь выборка всего списка; смотрите полный список .
Вы также можете создавать собственные настраиваемые теги шаблонов; смотрите Пользовательские теги и фильтры шаблонов.
Документация Django библиотек
Рецепты Django ORM
Рецепты Django ORM — это книга о работе с моделями Django ORM и Django. Django ORM является одним из ключевых столпов Django. Он предоставляет абстракции …
Django Rest Framework
Django Rest Framework (DRF) — это библиотека, которая работает со стандартными моделями Django для создания гибкого и мощного API для проекта.
Django CMS
Django CMS — это современная платформа для веб-публикаций, построенная на Django, фреймворке веб-приложений «для перфекционистов с соблюдением сроков». Django CMS предлагает готовую поддержку общих функций, …
Channels
Channels — это проект, который использует Django и расширяет его возможности за пределы HTTP — для обработки WebSockets, протоколов чата, IoT-протоколов и многого другого. Он …
ASGI — спецификация и утилиты
ASGI (Asynchronous Server Gateway Interface) является духовным наследником WSGI, предназначенным для обеспечения стандартного интерфейса между асинхронными веб-серверами, платформами и приложениями Python. WSGI предоставил стандарт для …
Python Social Auth
Python Social Auth — это простой в настройке механизм социальной аутентификации/регистрации с поддержкой нескольких платформ и провайдеров аутентификации. Созданный с использованием базового кода из django-social-auth, …
Документация Django
Django (Джанго) — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Проект поддерживается организацией Django Software Foundation.
Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми. Это одно из существенных архитектурных отличий этого фреймворка от некоторых других (например, Ruby on Rails). Один из основных принципов фреймворка — DRY (англ. Don’t repeat yourself).
Также, в отличие от других фреймворков, обработчики URL в Django конфигурируются явно при помощи регулярных выражений.
Для работы с базой данных Django использует собственный ORM, в котором модель данных описывается классами Python, и по ней генерируется схема базы данных.
Документация Django библиотек
Рецепты Django ORM
Рецепты Django ORM — это книга о работе с моделями Django ORM и Django. Django ORM является одним из ключевых столпов Django. Он предоставляет абстракции …
Django Rest Framework
Django Rest Framework (DRF) — это библиотека, которая работает со стандартными моделями Django для создания гибкого и мощного API для проекта.
Django CMS
Django CMS — это современная платформа для веб-публикаций, построенная на Django, фреймворке веб-приложений «для перфекционистов с соблюдением сроков». Django CMS предлагает готовую поддержку общих функций, …
Channels
Channels — это проект, который использует Django и расширяет его возможности за пределы HTTP — для обработки WebSockets, протоколов чата, IoT-протоколов и многого другого. Он …
ASGI — спецификация и утилиты
ASGI (Asynchronous Server Gateway Interface) является духовным наследником WSGI, предназначенным для обеспечения стандартного интерфейса между асинхронными веб-серверами, платформами и приложениями Python. WSGI предоставил стандарт для …
Python Social Auth
Python Social Auth — это простой в настройке механизм социальной аутентификации/регистрации с поддержкой нескольких платформ и провайдеров аутентификации. Созданный с использованием базового кода из django-social-auth, …
Доступ к вызовам методов¶
Большинство вызовов методов, прикрепленных к объектам, также доступны из шаблонов. Это означает, что шаблоны имеют доступ к гораздо большему, чем просто атрибуты класса (например, имена полей) и переменные, передаваемые из представлений. Например, Django ORM предоставляет синтаксис для поиска коллекции объектов, связанных с внешним ключом. Следовательно, учитывая модель под названием «comment» с отношением внешнего ключа к модели под названием «task», вы можете просмотреть все комментарии, прикрепленные к данной задаче, следующим образом:
{% for comment in task.comment_set.all %} {{ comment }} {% endfor %}
Аналогичным образом QuerySets предоставляет метод для подсчета количества содержащихся в них объектов. Следовательно, вы можете получить количество всех комментариев, относящихся к текущей задаче, с помощью:
{{ task.comment_set.all.count }}
Вы также можете получить доступ к методам, которые вы явно определили в своих собственных моделях:
models.py
class Task(models.Model): def foo(self): return "bar"
template.html
{{ task.foo }}
Организация вычислений на уровне СУБД
Фактически,
здесь приведены обертки над функциями, которые выполняются СУБД. Этих функций
достаточно много. Это и функции работы со строками, датой, математические
функции и так далее. Использование этих функций является рекомендуемой
практикой, т.к. СУБД оптимизировано для их выполнения. Конечно, все имеет свои
разумные пределы и нужно лишь по необходимости прибегать к этому функционалу.
Давайте для
примера рассмотрим использование функции Length для вычисления длины
строки. Первым делом нам нужно ее импортировать:
from django.db.models.functions import Length
И, затем,
аннотируем новое вычисляемое поле, например, для заголовков статей:
ps = Women.objects.annotate(len=Length('title'))
В результате, на
ряду со всеми стандартными полями, получим дополнительное поле len:
for item in ps: print(item.title, item.len)
По аналогии
используются все остальные подобные функции.
Теги ¶
Теги выглядеть следующим образом : . Теги более сложны, чем переменные: некоторые создают текст в выходных данных, некоторые управляют потоком, выполняя циклы или логику, а некоторые загружают внешнюю информацию в шаблон для использования последующими переменными.
Для некоторых тегов требуются начальные и конечные теги (т.е. ).
Django поставляется с двумя десятками встроенных тегов шаблонов. Вы можете прочитать все о них во . Чтобы дать вам представление о том, что доступно, вот некоторые из наиболее часто используемых тегов:
-
Переберите каждый элемент в массиве. Например, чтобы отобразить список спортсменов, представленный в :
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
- , И
-
Оценивает переменную, и если эта переменная имеет значение «истина», отображается содержимое блока:
{% if athlete_list %} Number of athletes: {{ athlete_list|length }} {% elif athlete_in_locker_room_list %} Athletes should be out of the locker room soon! {% else %} No athletes. {% endif %}
В приведенном выше примере, если не пусто, количество спортсменов будет отображаться переменной. В противном случае, если не пусто, отобразится сообщение «Спортсмены должны выйти…». Если оба списка пусты, «Спортсменов нет». будет отображаться.
Также в теге можно использовать фильтры и различные операторы :
{% if athlete_list|length > 1 %} Team: {% for athlete in athlete_list %} ... {% endfor %} {% else %} Athlete: {{ athlete_list.0.name }} {% endif %}
Хотя приведенный выше пример работает, имейте в виду, что большинство шаблонных фильтров возвращают строки, поэтому математические сравнения с использованием фильтров, как правило, не будут работать так, как вы ожидаете. это исключение.
- а также
- Настройте (см. Ниже), мощный способ сократить количество «шаблонов» в шаблонах.
Опять же, приведенное выше — это лишь выборка всего списка; полный список см. по .
Вы также можете создавать собственные настраиваемые теги шаблонов; см.
Пользовательские теги и фильтры шаблонов .
Рецепты Django ORM 2.0
Введение
- 1. Как найти запрос, связанный с набором запросов?
- 2. Как делать OR-запросы в Django ORM?
- 3. Как делать AND-запросы в Django ORM?
- 4. Как сделать NOT запрос в Django queryset?
- 5. Как выполнить объединение двух наборов запросов из одной или разных моделей?
- 6. Как выбрать только некоторые поля в наборе запросов?
- 7. Как сделать подзапросное выражение в Django?
- 8. Как отфильтровать набор запросов с критериями на основе сравнения значений их полей
- 9. Как отфильтровать поле FileField без какого-либо файла?
- 10. Как выполнять операции объединения в django ORM?
- 11. Как найти вторую по величине запись с помощью Django ORM?
- 12. Найти строки с дублирующимися значениями полей
- 13. Как найти значения разных полей из набора запросов?
- 14. Как использовать объекты для сложных запросов?
- 15. Как группировать записи в Django ORM?
- 16. Как эффективно выбрать случайный объект из модели?
- 17. Как использовать произвольные функции базы данных в кверисетах?
- 1. Как создать несколько объектов в одном запросе?
- 2. Как скопировать или клонировать существующий объект модели?
- 3. Как сделать так, чтобы можно было создать только один объект?
- 4. Как обновить денормализованные поля в других моделях при сохранении?
- 5. Как выполнить операцию truncate like с помощью Django ORM?
- 6. Какие сигналы подает Django во время создания или обновления объекта?
- 7. Как преобразовать строку в дату и сохранить в базе данных?
- 1. Как упорядочить набор запросов по возрастанию или убыванию?
- 2. Как упорядочить набор запросов без учета регистра?
- 3. Как сделать сортировку по двум полям
- 4. Как сделать сортировку по полю из связанной модели (с внешним ключом)?
- 5. Как сделать сортировку по аннотированному (вычисляемому) полю?
- 1. Как моделировать отношения один на один?
- 2. Как смоделировать отношения «один ко многим»?
- 3. Как смоделировать отношения «многие ко многим»?
- 4. Как включить самоссылающийся ключ ForeignKey в модель
- 5. Как преобразовать существующие базы данных в модели Django?
- 6. Как добавить модель для представления базы данных?
- 7. Как создать общую модель, которая может быть связана с любым типом сущности? (Например, категория или комментарий?).
- 8. Как указать имя таблицы для модели?
- 9. Как указать имя столбца для поля модели?
- 10. В чем разница между и ?
- 11. Как использовать UUID вместо ID в качестве первичного ключа?
- 12. Как использовать поле slug в django для большей читабельности?
- 13. Как добавить несколько баз данных в приложение django?
- 1. Как убедитьтся, что функция использовала фиксированное количество запросов?
- 2. Как ускорить тестирование путем повторного использования базы данных между прогонами теста?
- 3. Как перезагрузить объект модели из базы данных?
Дополнительные методы модели¶
В дополнение к методам , , объект модели может содержать некоторые из этих методов:
- ()
Для каждого поля, которое содержит , объект будет иметь метод , где имя поля. Этот метод возвращает удобное для восприятия название для значения поля.
Например:
from django.db import models class Person(models.Model): SHIRT_SIZES = ( ('S', 'Small'), ('M', 'Medium'), ('L', 'Large'), ) name = models.CharField(max_length=60) shirt_size = models.CharField(max_length=2, choices=SHIRT_SIZES)
>>> p = Person(name="Fred Flintstone", shirt_size="L") >>> p.save() >>> p.shirt_size 'L' >>> p.get_shirt_size_display() 'Large'
- (**kwargs)
- (**kwargs)
Для каждого поля и , которое не содержит , объект будет иметь методы и , где название поля. Они возвращают следующий и предыдущий объект в соответствии со значением этого поля, вызывая соответствующее исключение , если объект не существует.
Оба метода используют менеджер по умолчанию модели. Если вам необходимо использовать свой менеджер, которые должен выполнить какую-то фильтрацию, или просто добавить дополнительную фильтрацию, в методы можно передать дополнительные аргументы, которые должны соответствовать формату .
Создание объектов¶
Чтобы создать новый экземпляр модели, создайте его экземпляр, как и любой другой класс Python:
- class (**kwargs)
Ключевыми аргументами являются просто имена полей, которые вы определили в вашей модели
Обратите внимание, что создание экземпляра модели никоим образом не затрагивает вашу базу данных; для этого вам необходимо выполнить
Примечание
Вы можете испытать желание изменить модель, переопределив метод . Однако, если вы сделаете это, позаботьтесь о том, чтобы не изменять сигнатуру вызывающего, так как любое изменение может помешать сохранению экземпляра модели. Вместо того, чтобы переопределять , попробуйте использовать один из следующих подходов:
-
Добавьте метод в класс модели:
from django.db import models class Book(models.Model): title = models.CharField(max_length=100) @classmethod def create(cls, title): book = cls(title=title) # do something with the book return book book = Book.create("Pride and Prejudice")
-
Добавить метод в пользовательский менеджер (обычно предпочтительнее):
class BookManager(models.Manager): def create_book(self, title): book = self.create(title=title) # do something with the book return book class Book(models.Model): title = models.CharField(max_length=100) objects = BookManager() book = Book.objects.create_book("Pride and Prejudice")
Дополнительные методы экземпляра¶
В дополнение к , , у объекта модели могут быть некоторые из следующих методов:
- ()
Для каждого поля, для которого установлено , объект будет иметь метод , где — это имя поля. Этот метод возвращает «удобочитаемое» значение поля.
Например:
from django.db import models class Person(models.Model): SHIRT_SIZES = ( ('S', 'Small'), ('M', 'Medium'), ('L', 'Large'), ) name = models.CharField(max_length=60) shirt_size = models.CharField(max_length=2, choices=SHIRT_SIZES)
>>> p = Person(name="Fred Flintstone", shirt_size="L") >>> p.save() >>> p.shirt_size 'L' >>> p.get_shirt_size_display() 'Large'
Changed in Django 3.1:
Добавлена поддержка и .
- (**kwargs)
- (**kwargs)
Для каждого и , которые не имеют , объект будет иметь методы и , где — это имя поля. Это возвращает следующий и предыдущий объект относительно поля даты, вызывая исключение , когда это необходимо.
Оба эти метода будут выполнять свои запросы с использованием менеджера по умолчанию для модели. Если вам нужно эмулировать фильтрацию, используемую настраиваемым менеджером, или вы хотите выполнить одноразовую настраиваемую фильтрацию, оба метода также принимают необязательные ключевые аргументы, которые должны иметь формат, описанный в .
Обратите внимание, что в случае идентичных значений даты эти методы будут использовать первичный ключ в качестве прерывателя связей. Это гарантирует, что никакие записи не будут пропущены или дублированы
Это также означает, что вы не можете использовать эти методы на несохраненных объектах.
Документация Django
Django (Джанго) — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Проект поддерживается организацией Django Software Foundation.
Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми. Это одно из существенных архитектурных отличий этого фреймворка от некоторых других (например, Ruby on Rails). Один из основных принципов фреймворка — DRY (англ. Don’t repeat yourself).
Также, в отличие от других фреймворков, обработчики URL в Django конфигурируются явно при помощи регулярных выражений.
Для работы с базой данных Django использует собственный ORM, в котором модель данных описывается классами Python, и по ней генерируется схема базы данных.
Документация Django библиотек
Рецепты Django ORM
Рецепты Django ORM — это книга о работе с моделями Django ORM и Django. Django ORM является одним из ключевых столпов Django. Он предоставляет абстракции …
Django Rest Framework
Django Rest Framework (DRF) — это библиотека, которая работает со стандартными моделями Django для создания гибкого и мощного API для проекта.
Django CMS
Django CMS — это современная платформа для веб-публикаций, построенная на Django, фреймворке веб-приложений «для перфекционистов с соблюдением сроков». Django CMS предлагает готовую поддержку общих функций, …
Channels
Channels — это проект, который использует Django и расширяет его возможности за пределы HTTP — для обработки WebSockets, протоколов чата, IoT-протоколов и многого другого. Он …
ASGI — спецификация и утилиты
ASGI (Asynchronous Server Gateway Interface) является духовным наследником WSGI, предназначенным для обеспечения стандартного интерфейса между асинхронными веб-серверами, платформами и приложениями Python. WSGI предоставил стандарт для …
Python Social Auth
Python Social Auth — это простой в настройке механизм социальной аутентификации/регистрации с поддержкой нескольких платформ и провайдеров аутентификации. Созданный с использованием базового кода из django-social-auth, …
Документация Django библиотек
Рецепты Django ORM
Рецепты Django ORM — это книга о работе с моделями Django ORM и Django. Django ORM является одним из ключевых столпов Django. Он предоставляет абстракции …
Django Rest Framework
Django Rest Framework (DRF) — это библиотека, которая работает со стандартными моделями Django для создания гибкого и мощного API для проекта.
Django CMS
Django CMS — это современная платформа для веб-публикаций, построенная на Django, фреймворке веб-приложений «для перфекционистов с соблюдением сроков». Django CMS предлагает готовую поддержку общих функций, …
Channels
Channels — это проект, который использует Django и расширяет его возможности за пределы HTTP — для обработки WebSockets, протоколов чата, IoT-протоколов и многого другого. Он …
ASGI — спецификация и утилиты
ASGI (Asynchronous Server Gateway Interface) является духовным наследником WSGI, предназначенным для обеспечения стандартного интерфейса между асинхронными веб-серверами, платформами и приложениями Python. WSGI предоставил стандарт для …
Python Social Auth
Python Social Auth — это простой в настройке механизм социальной аутентификации/регистрации с поддержкой нескольких платформ и провайдеров аутентификации. Созданный с использованием базового кода из django-social-auth, …
Выборка записей по полям связанных моделей
В одном из
прошлых занятий мы с вами выбирали все записи из модели Women для
определенной категории, используя слаг:
Women.objects.filter(cat__slug='aktrisy')
Как это работает?
В действительности, вот этот параметр cat__slug сформирован по
следующему правилу:
<имя
первичной модели>__<название поля первичной модели>
То есть, здесь
мы обращаемся к первичной модели через атрибут cat, который
прописан во вторичной модели Women, а затем, через два подчеркивания
указываем имя поля тоже первичной модели, по которому отбираются записи уже
вторичной модели. И на выходе получаем список постов для актрис.
Этот синтаксис
немного похож на использование фильтра in:
Women.objects.filter(cat__in=1)
Только здесь
вместо указания списка идентификаторов рубрик, используется слаг с определенным
названием. Во всем остальном принцип работы идентичен.
Или, можно взять
другое поле (name) и по нему
произвести выборку записей из вторичной модели:
Women.objects.filter(cat__name='Певицы')
Мало того, после
имени поля можно дополнительно указывать различные фильтры. Например, выберем
записи, у которых имя категории содержит букву ‘ы’:
Women.objects.filter(cat__name__contains='ы')
Конечно, это
несколько странный, искусственный пример, но он хорошо показывает принцип
использования фильтров для полей первичной модели. Если уточнить этот фильтр:
Women.objects.filter(cat__name__contains='цы')
то получим уже
записи только по певицам. Или сделать наоборот, выбрать все категории, которые
связаны с записями вторичной модели Women, содержащие в
заголовке фрагмент строки «ли»:
Category.objects.filter(women__title__contains='ли')
Обратите
внимание, на выходе получим набор из нескольких повторяющихся категорий, каждая
из которых соответствует определенной записи из модели Women. Если нужно
отобрать только уникальные записи (категории), то дополнительно следует указать
метод distinct():
Category.objects.filter(women__title__contains='ли').distinct()
Шаблоны ¶
Шаблон — это текстовый файл. Он может генерировать любой текстовый формат (HTML, XML, CSV и т. Д.).
Шаблон содержит переменные , которые заменяются значениями при оценке шаблона, и теги , которые управляют логикой шаблона.
Ниже приведен минимальный шаблон, иллюстрирующий некоторые основы. Каждый элемент будет объяснен позже в этом документе.
{% extends "base_generic.html" %} {% block title %}{{ section.title }}{% endblock %} {% block content %} <h1>{{ section.title }}</h1> {% for story in story_list %} <h2> <a href="{{ story.get_absolute_url }}"> {{ story.headline|upper }} </a> </h2> <p>{{ story.tease|truncatewords:"100" }}</p> {% endfor %} {% endblock %}
Обновление объектов из базы данных¶
Если вы удаляете поле из экземпляра модели, при повторном доступе к нему значение из базы данных снова загружается:
>>> obj = MyModel.objects.first() >>> del obj.field >>> obj.field # Loads the field from the database
- (using=None, fields=None)
Если вам нужно перезагрузить значения модели из базы данных, вы можете использовать метод . Когда этот метод вызывается без аргументов, выполняется следующее:
- Все неотложенные поля модели обновляются до значений, присутствующих в настоящее время в базе данных.
- Все кэшированные отношения очищаются перезагрузкой экземпляра.
Только поля модели загружаются из базы данных. Другие зависящие от базы данных значения, такие как аннотации, не перезагружаются. Любые атрибуты также не очищаются.
Перезагрузка происходит из базы данных, из которой был загружен экземпляр, или из базы данных по умолчанию, если экземпляр не был загружен из базы данных. Аргумент может использоваться для принудительной перезагрузки базы данных.
Можно принудительно загрузить набор полей, используя аргумент .
Например, чтобы проверить, что вызов привел к ожидаемому обновлению, вы можете написать тест, подобный следующему:
def test_update_result(self): obj = MyModel.objects.create(val=1) MyModel.objects.filter(pk=obj.pk).update(val=F('val') + 1) # At this point obj.val is still 1, but the value in the database # was updated to 2. The object's updated value needs to be reloaded # from the database. obj.refresh_from_db() self.assertEqual(obj.val, 2)
Обратите внимание, что при доступе к отложенным полям загрузка значения отложенного поля происходит с помощью этого метода. Таким образом, можно настроить способ отложенной загрузки
В приведенном ниже примере показано, как можно перезагрузить все поля экземпляра при перезагрузке отложенного поля:
class ExampleModel(models.Model): def refresh_from_db(self, using=None, fields=None, **kwargs): # fields contains the name of the deferred field to be # loaded. if fields is not None fields = set(fields) deferred_fields = self.get_deferred_fields() # If any deferred field is going to be loaded if fields.intersection(deferred_fields): # then load all of them fields = fields.union(deferred_fields) super().refresh_from_db(using, fields, **kwargs)
- ()
Переопределение поведения сериализации и десериализации¶
Если вам нужно изменить поведение сериализации или десериализации класса сериализатора, вы можете сделать это, переопределив методы или .
Некоторые причины, по которым это может быть полезно, включают…
-
Добавление нового поведения для новых базовых классов сериализаторов.
-
Небольшое изменение поведения существующего класса.
-
Улучшение производительности сериализации для часто используемой конечной точки API, которая возвращает много данных.
Подписи для этих методов следующие:
Принимает экземпляр объекта, который требует сериализации, и должен вернуть примитивное представление. Обычно это означает возврат структуры встроенных в Python типов данных. Точные типы, которые могут быть обработаны, зависят от классов рендеринга, которые вы настроили для своего API.
Может быть переопределена для изменения стиля представления. Например:
def to_representation(self, instance): """Convert `username` to lowercase.""" ret = super().to_representation(instance) ret'username' = ret'username'.lower() return ret
Документация Django библиотек
Рецепты Django ORM
Рецепты Django ORM — это книга о работе с моделями Django ORM и Django. Django ORM является одним из ключевых столпов Django. Он предоставляет абстракции …
Django Rest Framework
Django Rest Framework (DRF) — это библиотека, которая работает со стандартными моделями Django для создания гибкого и мощного API для проекта.
Django CMS
Django CMS — это современная платформа для веб-публикаций, построенная на Django, фреймворке веб-приложений «для перфекционистов с соблюдением сроков». Django CMS предлагает готовую поддержку общих функций, …
Channels
Channels — это проект, который использует Django и расширяет его возможности за пределы HTTP — для обработки WebSockets, протоколов чата, IoT-протоколов и многого другого. Он …
ASGI — спецификация и утилиты
ASGI (Asynchronous Server Gateway Interface) является духовным наследником WSGI, предназначенным для обеспечения стандартного интерфейса между асинхронными веб-серверами, платформами и приложениями Python. WSGI предоставил стандарт для …
Python Social Auth
Python Social Auth — это простой в настройке механизм социальной аутентификации/регистрации с поддержкой нескольких платформ и провайдеров аутентификации. Созданный с использованием базового кода из django-social-auth, …
Постраничный вывод (Pagination)
Если у вас всего лишь несколько записей в базе данных, то наша страница вывода списка книг будет выглядеть отлично. Тем не менее, когда у вас появятся десятки, или сотни записей ваша страница станет значительно дольше загружаться (и станет слишком длинной для комфортного просмотра). Решением данной проблемы является добавление постраничного вывода (Pagination) к вашему отображению списка, который будет выводить ограниченное количество элементов на каждой странице.
Django имеет отличный встроенный механизм для постраничного вывода. Даже более того, он встроен в обобщённый класс отображения списков, следовательно вам не нужно проделывать большой объем работы, чтобы воспользоваться возможностями постраничного вывода!
Откройте catalog/views.py и добавьте поле как показано жирным в следующем фрагменте.
Как только у вас появится более 10 записей в базе данных отображение начнёт формировать постраничный вывод данных, которые он передаёт шаблону. К различным страницам данного вывода можно получить доступ при помощи параметров GET-запроса — к странице 2 вы можете получить доступ, используя URL-адрес: .
Теперь, когда данные выводятся постранично, нам надо добавить функциональность переключения между страницами в шаблона страницы. Поскольку мы хотели бы использовать данный механизм для всех списков на сайте, то мы пропишем его в базовом шаблоне сайта.
Откройте /locallibrary/catalog/templates/base_generic.html и, ниже блока , вставьте блок (во фрагменте не выделен жирным), отвечающий за постраничный вывод. Данный код, в первую очередь, проверяет «включён» ли механизм постраничного вывода для данной страницы и если это так, то он добавляет ссылки и соответственно (а также, номер текущей страницы).
Параметр является объектом типа , который будет создаваться каждый раз, когда будет применяться постраничный вывод данных для текущей страницы. Он позволяет получить всю информацию о текущей странице, о предыдущих страницах, сколько всего страниц и так далее.
Мы используем для получения URL-адреса текущей страницы, для того, чтобы создать ссылки на соответствующие страницы, обратите внимание, что данный вызов не зависит от объекта и, таким образом, может использоваться отдельно. На этом все!
На этом все!
Картинка ниже показывает как выглядит постраничный вывод — если вы не добавили более 10 записей в вашу базу данных, тогда вы можете проверить как это работает, просто уменьшив значение в в файле catalog/views.py. Для получения результата, соответствующего картинке ниже, мы изменили.
Ссылки на страницы показаны в нижней части страницы. Показаны ссылки следующая/предыдущая в зависимости от того на какой странице вы в данный момент находитесь.