Определение параметров через функцию re_path
Подобным образом мы также можем использовать функцию re_path для определения параметров. Давайте в файле views.py переделаем функцию user, а именно уберем параметры по умолчанию:
def user(request, name, age):
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),
]
Для представления параметра в шаблоне адреса используется выражение ?P<>.
Общее определение параметру соответствует формату (?P<имя_параметра>регулярное_выражение).
Между угловыми скобками помещается название параметра. После закрывающей угловой скобки идет регулярное выражение, которому должно соответствовать значение параметра.
Во втором шаблоне адреса определяются два параметра: name и age. И как мы уже знаем из шага 2 "Основные элементы синтаксиса регулярных выражений", параметр age должен представлять число, а параметр name должен состоять только из буквенных символов.
Теперь мы можем через адресную строку передать данные в приложение, перейдем по адресу http://127.0.0.1:8000/user/Tom/38/:
Также как и через path можем указать для определенных параметров значения по умолчанию, изменим функцию в 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