Начало работы с представлениями

Завершено

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

В Django представление обычно отвечает за:

  • проверку запроса пользователя;
  • загрузку или изменение соответствующих данных;
  • возврат HTML-шаблона с информацией для пользователя.

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

Создание представления

Чтобы создать представление с нуля в Django, обычно создается функция. Функция, как правило, содержит соответствующий код, позволяющий:

  • Выполнить запрошенную пользователем задачу.
  • Возвратить шаблон с соответствующими данными для отображения пользователю.

Функции просмотра всегда имеют по крайней мере один параметр с именем request, который содержит запрос пользователя. Если вы ожидаете дополнительные сведения от пользователя в URL-адресе, например имя или идентификатор элемента, вы можете указать дополнительные параметры. Вы зарегистрируете их при создании маршрута, о котором мы поговорим в этом уроке позже.

Загрузка данных

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

В создаваемом нами проекте есть две модели: Shelter и Dog. Мы можем загрузить все объекты или выполнить другие запросы, используя созданные нами модели. Для загрузки всех приютов мы используем Shelter.objects.all(). Для загрузки отдельного приюта можно использовать Shelter.objects.get(pk=1).

Примечание.

pk — это сокращение для первичного ключа. Сid можно получить тот же результат, но использование pk гарантирует, что команда сработает, если вы задали другое значение свойству, обозначающему имя первичного ключа.

Ошибки 404

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

В Django есть специальные сокращенные функции для загрузки данных:

  • get_object_or_404 и get_list_or_404: загружает объект по первичному ключу или возвращает ошибку 404 для пользователя, если объект не найден.
  • get_list_or_404: выполняет ту же операцию, что и предыдущая функция, с использованием параметров фильтра.

В этом упражнении мы используем get_object_or_404.

Отрисовка шаблона

Подсистема шаблонов Django использует создаваемый нами шаблон HTML, объединит его с любыми предоставленными данными и выдаст HTML-код для браузера. Вспомогательная функция для выполнения этой задачи — render.

Функции render необходим объект, представляющий запрос. Это параметр request, о котором мы говорили ранее. Вы также передаете имя шаблона, обычно в виде HTML-файла, который будет находиться в папке templates.

Для передачи данных в шаблон функции render требуется объект словаря context. Объект context содержит набор пар ключ/значение, где каждый ключ превращается в переменную в шаблоне.

Пример

Чтобы создать представление для отображения всех приютов, можно использовать следующий код:

def shelter_list(request):
    shelters = Shelter.objects.all()
    context = { 'shelters': shelters }
    return render(request, 'shelter_list.html', context)

Регистрация пути

Почти любая веб-платформа использует пути для обработки запросов пользователей. Пути преобразуют часть URL-адреса после имени домена и перед строкой запроса (которая идет после вопросительного знака) в вызов функции.

Вызов www.contoso.com/shelters позволяет вызвать функцию для отображения всех приютов, а www.contoso.com/shelters/1 вызывает функцию вывода приюта с идентификатором 1. Пути в Django можно регистрировать при помощи URLconf.

Предположим, что у нас есть модуль с именем views, согласно конвенции Django. Мы можем направить трафик, путь для которого не указан (например, www.contoso.com) в функцию index модуля views, и задать ему имя index, используя следующий путь:

path('', views.index, 'index')

Кроме того, можно создавать виртуальные папки для конкретных запросов. Например, чтобы вывести список всех приютов по запросу /shelters, можно использовать следующую команду:

path('shelters', views.shelter_list, 'shelter_list')

Параметры URL-адреса

Нередко такие параметры, как идентификатор или имя, передаются в приложение в составе URL-адреса. Так как эти значения могут меняться, мы не будем их жестко привязывать к пути. В Django можно указать параметр с помощью специального синтаксиса. Этот синтаксис позволяет указать тип ожидаемых данных, например целое число, и имя.

Например, чтобы создать путь для запроса определенного приюта по идентификатору, потребуется параметр типа integer. (Потому что наш первичный ключ является целым числом.) Также можно указать имя для переменной, которое затем будет передаваться в качестве параметра функции представления. Синтаксис для идентификации этого параметра:<int:pk>. Обратите внимание на структуру: объявление типа, двоеточие, а затем имя переменной.

Полный путь может выглядеть следующим образом:

path('shelter/<int:pk>', views.shelter_detail, name='shelter_detail')

Связанная функция представления будет иметь следующую сигнатуру:

def shelter_detail(request, pk):
    # code

Часть pk сигнатуры пути передается в shelter_detail как параметр, точно так же, как при вызове обычной функции Python.