Как получить текущее URL-имя с помощью Django?
-
21-09-2019 - |
Вопрос
Я должен динамически создавать URL-адрес в соответствии с текущим URL-адресом.Используя {% url %}
тег - самый простой способ сделать это, но мне нужно текущее URL-имя, чтобы динамически генерировать новое.
Как я могу получить URL-имя, прикрепленное к urlconf, которое ведет к текущему представлению?
Редактировать :Я знаю, что могу вручную создать URL-адрес, используя get_absolute_url
но я бы предпочел избежать этого, поскольку это часть лекции, и я хотел бы продемонстрировать только один способ создания URL-адресов.
Студенты знают, как использовать {% url %}
.Они, как известно, сталкиваются с проблемой, когда им приходится генерировать более полный URL-адрес на основе текущего.Самый простой способ - это использовать {% url %}
опять же, с некоторыми вариациями.Поскольку мы назвали url, нам нужно знать, как получить имя URL-адреса, который вызвал текущее представление.
ПРАВКА 2:другим вариантом использования является отображение частей базового шаблона по-разному в соответствии с базовым шаблоном.Есть и другие способы сделать это (используя CSS и {% block %}, но иногда просто приятно иметь возможность удалить тег пункта меню base.html если viewname совпадает со ссылкой.
Решение
Я не знаю, как долго эта функция была частью Django, но поскольку следующая статья показывает, что это может быть достигнуто следующим образом в представлении:
from django.core.urlresolvers import resolve
current_url = resolve(request.path_info).url_name
Если вам это нужно в каждом шаблоне, может быть уместно написать запрос на шаблон.
Редактировать:ПРИМЕНЕНИЕ НОВОГО ОБНОВЛЕНИЯ DJANGO
После текущего обновления Django:
Джанго 1.10 (Ссылка)
Импорт из
django.core.urlresolvers
модуль устарел в в пользу его нового расположения,django.urls
Джанго 2.0 (Ссылка)
В
django.core.urlresolvers
модуль будет удален в пользу новой расположение,django.urls
.
Таким образом, правильный способ сделать это выглядит следующим образом:
from django.urls import resolve
current_url = resolve(request.path_info).url_name
Другие советы
Начиная с Django 1.5, к нему можно получить доступ из объекта запроса
current_url = request.resolver_match.url_name
Для тех, кто использует пространство имен для своих шаблонов URL-адресов, вас может заинтересовать URL-адрес запроса с пространством имен.В данном случае Django назвал это view_name
вместо этого.
request.resolver_match.view_name
# return: <namespace>:<url name>
Это может быть достигнуто с помощью:
request.resolver_match.url_name
Django >1.8
Разъяснение вопроса:"В представлении, как вы получаете имя urlpattern, которое указывает на него, предполагая, что существует ровно один такой urlpattern".
Это может быть желательно по указанным причинам:из представления нам нужен ПРОСТОЙ способ получения URL-адреса к тому же представлению (мы не хотим знать наше собственное имя urlpattern).
Короткий ответ:На самом деле преподавать в своем классе недостаточно просто, но вам может быть интересно сделать это через час или два и забросить на GitHub.
Если бы вы действительно хотели это сделать, вам пришлось бы создать подкласс RegexURLResolver и изменить метод resolve, чтобы возвращать соответствующий шаблон (из которого вы можете получить имя шаблона) вместо пар view и ключевое слово / значение.http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142
Затем вы могли бы создать декоратор или, возможно, более подходящее промежуточное программное обеспечение, которое использует этот подкласс для получения имени шаблона и сохранения этого значения где-нибудь в запросе, чтобы представления могли его использовать.
Если вы действительно хотите это сделать и столкнетесь с какими-то проблемами, дайте мне знать, и я, вероятно, смогу помочь.
Для вашего класса я бы просто попросил их жестко закодировать имя шаблона в представлении или шаблоне.Я считаю, что это приемлемый способ сделать это.
Обновить: Чем больше я думаю об этом, тем больше я бы отказался от попыток получить имя urlpattern в представлении.параметры urlpattern в значительной степени независимы от параметров представления, на которое они указывают.Если вы хотите указать на определенный URL-адрес, вам нужно знать, как работает urlpattern, а не только как работает представление.Если вам нужно знать, как работает urlpattern, вам также может потребоваться знать имя urlpattern.
Это немного неясно из вашего вопроса, но http://docs.djangoproject.com/en/dev/topics/http/urls/ скорее всего, это даст объяснение тому, что вам нужно.
Особенно полезно отметить, как Django обрабатывает запросы:
Когда пользователь запрашивает страницу с вашего сайта на базе Django, система следует этому алгоритму, чтобы определить, какой код Python выполнять:
- Django определяет корневой модуль URLconf для использования.Обычно это значение параметра ROOT_URLCONF, но если входящий объект HttpRequest имеет атрибут с именем urlconf (задается обработкой запроса промежуточным программным обеспечением), его значение будет использоваться вместо параметра ROOT_URLCONF.
- Django загружает этот модуль Python и ищет переменную urlpatterns.Это должен быть список Python в формате, возвращаемом функцией django.conf.urls.defaults.patterns().
- Django просматривает каждый шаблон URL по порядку и останавливается на первом, который соответствует запрошенному URL.
- Как только одно из регулярных выражений совпадает, Django импортирует и вызывает данное представление, которое представляет собой простую функцию Python.Представлению передается HttpRequest в качестве первого аргумента и любые значения, зафиксированные в регулярном выражении, в качестве остальных аргументов.
Если вам нужен только полный путь, вы можете попробовать:
Я надеюсь, что это поможет - это указывает, как использовать модуль URLconf, и, надеюсь, поможет указать вам правильное направление.