Обратное разрешение интернет-адресов в Django

В проекте используется следующий HTML-код для формирования гиперссылок на рубрики:

<a href="/bboard/{{ rubric.pk }}">{{ rubric.name }}</a>

Ссылка на целевую страницу, подставляемая в атрибут href, формируется из префикса bboard с добавлением ключа рубрики. Это работает, но в дальнейшем может доставить неудобство. К примеру, если возникнет необходимость изменить префикс, придется изменять код во всех используемых шаблонах.

Избежать такой ситуации поможет обратное разрешение интернет-адресов. Данный инструмент Django представляет собой специальный тег шаблонизатора, который формирует интернет-адрес, беря за основу имя маршрута, в котором он записан. Также могут использоваться URL-параметры, если используется параметризированный маршрут.

Сначала нужно добавить имена маршрутов, сделав их именованными. Откроем файл urls.py пакета приложения и изменим код, формирующий маршруты:

. . .
urlpatterns = [
    path('<int:rubric_id>/', by_rubric, name='by_rubric'),
    path('', index, name='index'), 
]

Для указания имени служит именованный параметр name функции path(). Далее необходимо вставить в код гиперссылок специальные теги шаблонизатора url. Именно они и обеспечивают обратное разрешение адресов. Откроем созданный ранее шаблон bboard\index.html и найдем строку:

<a href="/bboard/{{ rubric.pk }}/">

ее нужно заменить на:

<a href="{% url 'by_rubric' rubric.pk %}">

Первый параметр тега – имя маршрута, далее идут значения  URL-парметров.

Далее найдем код, формирующий ссылку на главную страницу:

<a href="/board/">

Заменим на:

<a href="{% url 'index' %}">

Данный маршрут не является параметризированным, поэтому URL-параметры отсутствуют.

Аналогично можно исправить все остальные ссылки используемые в шаблонах. После обновления страницы в браузере пробуем перейти по всем ссылкам – все ссылки должны быть корректными.





Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: