Как заставить Django правильно писать ссылки на страницы?

#html #css #django

Вопрос:

Я настроил свой веб-сайт проекта Django, который представляет собой генератор лабиринтов, чтобы иметь навигационную панель, кнопки которой ссылаются на другие созданные мной страницы.

Например, каталог страницы «стиль» — это просто /стиль, поэтому он открывает страницу, на которую ссылается «стили», а затем, если я нажму кнопку «Домашняя страница» на панели навигации, она перейдет в /home.Все хорошо.

Но когда я перехожу на отдельные страницы лабиринта, ссылки на которые-это просто число(например, 3), если я нажму кнопку навигационной панели, чтобы перейти на главную страницу, а не на http://127.0.0.1:8000/home он пытается перейти к http://127.0.0.1:8000/3/home которого не существует.

Есть ли способ изменить то, как Django обрабатывает ссылки, чтобы удалить каталог перед ним.

html-код навигационной панели

url-адреса страницы в django

Ответ №1:

Предполагая, что вы urls.py настроены правильно, вы можете использовать {% url %} тег шаблона следующим образом:

 <a href="{% url 'urlname' %}">...</a>
 

И Django автоматически заменит это фактическим URL- urlname адресом . Чтобы это сработало, ваши urls.py пути должны быть определены следующим образом:

 path("some/url/here", views.my_view_function, name="urlname")
 

name Атрибут является здесь важной частью.

Написав href="3" , вы просто указываете браузеру, что нужно искать https://example.com/whatever/the/current/url/is/3 , другими словами, это относительно текущей позиции.
Чтобы сделать его абсолютным, вам нужно либо начать с / (что приведет к созданию URL-адресов относительно текущего домена, например href="3" https://example.com/3 ), либо написать его полностью, включая ту https://example.com/ часть, которая приведет именно туда, куда указано.

Django автоматически позаботится об этом, когда вы используете {% url %} тег.

Комментарии:

1. Спасибо, добрый сэр, с большой любовью к вам x

2. @comalley_ пожалуйста, не забудьте отметить ответ как принятый, если он решил вашу проблему.