Django 5 для начинающих

Прогресс по курсу:  9/1004

2.4 Диспетчер URL, часть 1.
4 из 14 шагов пройдено
0 из 42 баллов  получено

Определение параметров через функцию 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


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Вместо Bob - Tom

@Георгий_Тимофеев, спасибо, исправил.

При таком регулярном выражении

re_path(r"^user/(?P<name>\D+)/(?P<age>\d+)/", views.user)

Запрос должен выглядеть с слэшем на конце.

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

Не мог понять в чем у меня ошибка, почему при переходе отображается 0

@Артем_Азанов, Спасибо, исправил ссылки.