Программа курса:
Определение параметров через функцию re_path
Также как и при использовании функции path()
мы можем использовать и функцию re_path()
при задании параметров в маршрутах.
Давайте изменим определение функции user()
в файле views.py
, уберём из него значения параметров по умолчанию:
def user(request, name, age):
return HttpResponse(f'<h2>Имя: {name}, Возраст: {age}</h2>')
Затем отредактируем файл urls.py
, удалим маршруты для функции user()
, и создадим новый на основе функции re_path()
и шаблона URL на основе регулярного выражения:
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),
re_path(r'^user/(?P<name>\D+)/(?P<age>\d+)/', views.user),
]
Чтобы задать параметр в шаблоне адреса, используется конструкция вида: ?P<>
.
Формат определения параметра: (?P<имя_параметра>регулярное_выражение)
.
В имени параметра указывается его название, обрамлённое символами <
и >
. После символа >
следует регулярное выражение, которому должно соответствовать значение параметра.
Во втором шаблоне адреса мы определяем два параметра: name
и age
. Как было сказано во втором шаге "Основные элементы синтаксиса регулярных выражений", параметр age
должен состоять из цифровых символов, а параметр name
- из не цифровых символов.
Запустим отладочный сервер и выполним запрос по URL-адресу http://127.0.0.1:8000/user/Tom/38/, который будет обработан функцией user()
.
В этом запросе мы передали значения для параметров name
и age
:
Также как и при использовании функции path()
мы можем задать значения по умолчанию для параметров данной функции. Для этого отредактируем определение функции user()
, в файле views.py
, следующим образом:
def user(request, name='Undefined', age=0):
return HttpResponse(f'<h2>Имя: {name}, Возраст: {age}</h2>')
В этом случае надо дополнительно определить еще маршруты в файле 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),
re_path(r'^user/(?P<name>\D+)/(?P<age>\d+)/', views.user),
re_path(r'^user/(?P<name>\D+)/', views.user),
re_path(r'^user/', views.user),
]
Обратите внимание на порядок размещения маршрутов, оно такое же, как и с помощью функции path()
, сначала размещаются более конкретные маршруты с большим количеством параметров.
Теперь при переходе на страницу http://127.0.0.1:8000/user/Tom/38/ мы увидим сообщение Имя: Tom, Возраст: 38
,
а при переходе по ссылке http://127.0.0.1:8000/user/Tom/ будет сообщение Имя: Tom, Возраст: 0
, так как будет подставлено значение по умолчанию. А при переходе http://127.0.0.1:8000/user/ мы увидим значения по умолчанию, это Имя: Undefined, Возраст: 0