Программа курса:

1.1 - Как работает интернет и веб-сайты 1.2 - Краткий конспект по HTML 1.3 - Кратко о SQL
2.1 - Что такое Django? 2.2 - Основные принципы MVC 2.3 - Установка Django и создание проекта HelloWorld 2.4 - Диспетчер URL, часть 1. 2.5 - Диспетчер URL, часть 2. 2.6 - Шаблоны, часть 1. 2.7 - Шаблоны, часть 2. 2.8 - Введение в тестирование приложений
3.1 - Создание проекта, первые модели и админ-панель 3.2 - Модели в Django и их поля 3.3 - Первые ORM запросы CRUD 3.4 - Организация связей между таблицами 3.5 - Django ORM методы возвращающие QuerySet 3.6 - Django ORM методы которые не возвращают QuerySet 3.7 - Django ORM поисковые поля и агрегатные функции 3.8 - Views/Templates/URLs
4.1 - Формы в Django 4.2 - CRUD проект
5.1 - Создание проекта и приложения 5.2 - Создание моделей данных блога 5.3 - Сайт администрирования 5.4 - Работа с наборами запросов QuerySet и менеджерами 5.5 - Разработка представлений списка и детальной информации 5.6 - Создание шаблонов представлений 5.7 - Итоги работы
6.1 - Работа с URL 6.2 - Добавление постраничной разбивки 6.3 - Разработка представлений на основе классов 6.4 - Рекомендация постов по электронной почте 6.5 - Создание системы комментариев 6.6 - Добавление функциональности тегирования 6.7 - Извлечение постов по сходству 6.8 - Реализация конкретно-прикладных шаблонных тегов и фильтров 6.9 - Добавление карты сайта 6.10 - Установка базы данных PostgreSQL 6.11 - Добавление полнотекстового поиска в блог
7.1 - Введение в пользовательскую систему Django 7.2 - Использование системы аутентификации Django 7.3 - Доработки системы авторизации и регистрации добавление сессий 7.4 - Профили пользователей и пользовательские поля модели User 7.5 - Авторизация через социальные сети посредством OAuth 2.0 7.6 - Улучшаем дизайн блога с использованием Bootstrap 5 7.7 - Итоги работы
8.1 - Введение в REST API 8.2 - Django REST Framework на примере блога 8.3 - Сериализаторы 8.4 - Представления 8.5 - Фильтрация и поиск 8.6 - Пагинация 8.7 - Права доступа и токены в DRF 8.8 - Схемы и документация 8.9 - Итоги работы
9.1 - Покупка VPS, доменного имени, привязка DNS и настройка по SSH. 9.2 - Установка виртуального окружения Gunicorn и списка зависимостей 9.3 - Установка PostgreSQL, настройка и перенос БД 9.4 - Установка и настройка NGINX 9.5 - Получение SSL сертификата от Lets Encrypt и настройка HTTPS
10.1 - Начало работы, создание модели статей 10.2 - Создание древовидной модели категорий 10.3 - Представления на основе классов 10.4 - Работа с ListView, вывод списка статей 10.5 - Работа с DetailView, форматирование и обработка кириллицы в Slug 10.6 - Вывод дерева категорий, пагинация, добавление Bootstrap 5 10.7 - Оптимизация SQL запросов и установка Debug-Toolbar 10.8 - Профили пользователей. Модели и сигналы 10.9 - Профили пользователей. Представления и формы. 10.10 - Работа с CreateView. Добавление записей пользователями. 10.11 - Работа с UpdateView. Обновление записей пользователями. 10.12 - Использование миксинов в работе с представлениями Django 10.13 - Доработки системы авторизации и регистрации 10.14 - Итоги работы
11.1 - Создание древовидных комментариев 11.2 - Создание древовидных комментариев, добавление JavaScript 11.3 - Добавление функциональности тегирования 11.4 - Добавление ReCAPTCHA для форм 11.5 - Интеграция WYSIWYG-редактора, установка CKEditor 5 11.6 - Создание системы Like/Dislike 11.7 - Добавление RSS ленты для блога 11.8 - Кеширование и Middleware для получения статуса пользователей 11.9 - Свои шаблоны для страниц ошибок 403, 404 11.10 - Итоги работы

Параметры представлений

 

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

Рассмотрим следующий URL-адрес:

http://127.0.0.1:8000/user/Tom/38/


В этом URL-адресе последние два сегмента Tom/38/ могут быть параметрами URL, которые связанны с параметрами функции-представления через систему маршрутизации. Такие параметры обычно называются параметрами маршрута.


Определение параметров через функцию path()

Откроем файл views.py и добавим в него код новой функции user():

from django.http import HttpResponse


def index(request):
    return HttpResponse('<h2>Главная</h2>')


def about(request, name, age):
    return HttpResponse(f'''
        <h2>О пользователе</h2>
        <p>Имя: {name}</p>
        <p>Возраст: {age}</p>
    ''')


def contact(request):
    return HttpResponse('<h2>Контакты</h2>')


def user(request, name):
    return HttpResponse(f'<h2>Имя: {name}</h2>')


В этом примере функция user() имеет два параметра. Значение параметра name нам необходимо получать из запрошенного URL-адреса. Следовательно параметр name будет являться параметром маршрута. Соответственно как любой другой параметр мы сможем использовать его внутри функции.

Добавим в файл urls.py маршрут для функции user():

from django.urls import path, re_path
from blog import views

urlpatterns = [
    path('', views.index),
    path('about/', views.about, kwargs={'name': 'Tom', 'age': 38}),
    re_path(r'^contact/', views.contact),
    path('user/<str:name>/', views.user),
]


В шаблоне пути 'user/<str:name>/' указан параметр name, который будет извлечён из URL-адреса и передан в функцию user() в виде параметра с таким же именем - name.

Параметры в шаблоне пути обрамляются символами < и > в виде формата: <спецификатор:название_параметра>.

В этом примере для параметра name указан спецификатор str.


По умолчанию Django предоставляет следующие спецификаторы:

  • str: соответствует любой строке за исключением символа /. Если спецификатор не указан, то данный спецификатор используется по умолчанию.
  • int: соответствует любому положительному числу, а также нулю.
  • slug: соответствует последовательности буквенных символов ASCII, цифр, дефиса и символа подчеркивания, например: building-your-1st-django-site.
  • uuid: соответствует идентификатору UUID, например: 075194d3-6885-417e-a8a8-6c931e272f00.
  • path: соответствует любой строке, которая также может включать символ / в отличие от спецификатора str.


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

Запустим отладочный сервер и выполним запрос по URL-адресу http://127.0.0.1:8000/user/Tom, который будет обработан функцией user().

В этом запросе мы передали значение для параметра name:


А если мы перейдем http://127.0.0.1:8000/user/Bob


Подобным образом можно определить и большее количество параметров.
Например, добавим второй параметр в функцию user в views.py:

def user(request, name, age):
    return HttpResponse(f'<h2>Имя: {name} Возраст:{age}</h2>')


А в файле urls.py добавим в маршрут параметр age:

path('user/<str:name>/<int:age>/', views.user),

Предполагается, что параметр age будет представлять число, поэтому для него используется спецификатор int.
В этом случае мы можем обратиться к функции user, например, с помощью запроса http://127.0.0.1:8000/user/Tom/38:

В этом случае сегмент /Tom/ будет сопоставлен с параметром name, а /38 - с параметром age:


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

Параметры маршрута являются частью шаблона пути. Если в строке запроса отсутствуют значения для этих параметров, то запрос не соответствует определённому маршруту. Из-за этого Django не сможет найти нужный маршрут для обработки запроса, и мы получаем ошибку 404 (ресурс не найден).

Но иногда такое поведение нежелательно. Мы можем задать значения по умолчанию для параметров маршрута на тот случай, если через строку запроса не передаются значения.

Изменим определение функции user() в файле представлений views.py, зададим для её параметров значения по умолчанию:

def user(request, name='Undefined', age=0):
    return HttpResponse(f'<h2>Имя: {name} Возраст: {age}</h2>')


Если для параметра name не будет передано значение, то он получит строку Undefined в качестве значения. Для параметра age значение по умолчанию задано равным 0.

Но если данные параметры будут отсутствовать в запрошенном URL-адресе, то Django не сможет найти соответствующий ему маршрут. В данной ситуации необходимо определить дополнительные маршруты для функции user(), без этих параметров.

Для этого добавим два дополнительных маршрута в файл urls.py:

from django.urls import path, re_path
from blog import views

urlpatterns = [
    path('', views.index),
    path('about/', views.about, kwargs={'name': 'Tom', 'age': 38}),
    re_path(r'^contact/', views.contact),
    path('user/<str:name>/<int:age>/', views.user),
    path('user/<str:name>/', views.user),
    path('user/', views.user),
]


Если мы запросим URL http://127.0.0.1:8000/user/Tom/38 , то получим страницу с текстом Имя: Tom, Возраст: 38.

При запросе этого URL http://127.0.0.1:8000/user/Tom на странице будет текст Имя: Tom, Возраст: 0, так как было использовано значение по умолчанию для параметра age.

А для такого URL http://127.0.0.1:8000/user/ на странице будет такой текст Имя: Undefined, Возраст: 0, так как были использованы значения по умолчанию для обоих параметров name и age.

Перейти к следующему шагу

Возникли вопросы при прочтении лекции? Задайте вопрос в комментариях

Комментарии