Как получить текущее имя URL с помощью Django? - PullRequest
78 голосов
/ 22 марта 2010

Я должен построить URL-адрес динамически в соответствии с текущим URL-адресом. Использование тега {% url %} - это самый простой способ сделать это, но мне нужно текущее имя URL для динамического создания нового.

Как я могу получить имя URL, прикрепленное к urlconf, которое ведет к текущему представлению?

РЕДАКТИРОВАТЬ: я знаю, что я могу вручную изготовить URL, используя get_absolute_url, но я бы предпочел этого избежать, так как это часть лекции, и я хотел бы продемонстрировать только один способ создания URL.

Студенты знают, как использовать {% url %}. Они знают, что сталкиваются с проблемой, когда им нужно сгенерировать более полный URL-адрес на основе текущего. Самый простой способ - снова использовать {% url %} с некоторыми вариациями. Поскольку мы назвали URL-адрес, , нам нужно знать, как получить имя URL-адреса, вызвавшего текущее представление.

РЕДАКТИРОВАТЬ 2: другой вариант использования для отображения частей базового шаблона по-разному в соответствии с базовым шаблоном. Есть и другие способы сделать это (используя CSS и {% block%}, но иногда просто приятно иметь возможность удалить тег из пункта меню base.html, если имя представления соответствует ссылке.

Ответы [ 7 ]

106 голосов
/ 10 января 2012

Я не знаю, как долго эта функция была частью Django, но, как показывает следующая статья , это можно сделать следующим образом:

   from django.core.urlresolvers import resolve
   current_url = resolve(request.path_info).url_name

Если вам нужно это в каждом шаблоне, написание шаблона может быть уместным.

Редактировать: ПРИМЕНЕНИЕ НОВОГО ОБНОВЛЕНИЯ ДЖАНГО

После текущего обновления Django:

Джанго 1,10 ( ссылка )

Импорт из модуля django.core.urlresolvers устарел в в пользу его нового местоположения, django.urls

Django 2.0 ( ссылка )

Модуль django.core.urlresolvers удален в пользу его нового местоположение, django.urls.

Таким образом, правильный способ сделать это так:

from django.urls import resolve
current_url = resolve(request.path_info).url_name
100 голосов
/ 12 июля 2013

Начиная с Django 1.5, к этому можно обратиться из объекта запроса

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.resolver_match

20 голосов
/ 01 июля 2016

Для тех, кто присваивает пространство имен своим шаблонам URL-адресов, вас может заинтересовать имя запроса с пространственным именем. В этом случае Django назвал это view_name вместо.

request.resolver_match.view_name

# return: <namespace>:<url name>
10 голосов
/ 11 августа 2015

Это может быть достигнуто через:

request.resolver_match.url_name

Джанго> 1,8

3 голосов
/ 05 апреля 2010

Уточнение вопроса: «Как вы получаете имя URL-шаблона, указывающего на него, если предположить, что существует только один такой URL-шаблон?»

Это может быть желательно по указанным причинам.: из представления нам нужен СУХОЙ способ получения URL-адреса для того же представления (нам не нужно знать наше собственное имя urlpattern).

Краткий ответ: на самом деле это не так просто, чтобыпреподавайте свой класс, но это может быть забавно для вас сделать через час или два и бросить GitHub.

Если вы действительно хотите это сделать, вам придется создать подкласс RegexURLResolver и изменить разрешениеметод возврата совпавшего шаблона (из которого вы можете получить имя шаблона) вместо пар вида и ключевого слова / значения.http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142

Затем можно создать декоратор или, возможно, более подходящее промежуточное программное обеспечение, которое использует этот подкласс для получения имени шаблона и сохранения этого значения где-то в запросе, чтобы представления могли использовать его.

Если вы действительно хотите это сделать, и у вас возникли какие-то проблемы, дайте мне знать, и я, возможно, смогу помочь.

Для вашего класса я бы просто попросил их жестко закодировать имя шаблона в представлении или шаблоне.Я полагаю, что это приемлемый способ сделать это.

Обновление: Чем больше я думаю об этом, тем больше я бы не стал пытаться получить имя urlpattern в представлении.Параметры urlpattern довольно независимы от параметров представления, на которое они указывают.Если вы хотите указать на определенный URL, вам нужно знать, как работает urlpattern, а не только как работает представление.Если вам нужно знать, как работает urlpattern, вам также может быть необходимо знать имя urlpattern.

1 голос
/ 22 марта 2010
0 голосов
/ 22 марта 2010

Это немного неясно из вашего вопроса, но http://docs.djangoproject.com/en/dev/topics/http/urls/, вероятно, даст объяснение того, что вы ищете.

Особенно полезно отметить, как Django обрабатывает запросы:

Когда пользователь запрашивает страницу с вашего сайта на платформе Django, система использует следующий алгоритм для определения кода Python для выполнения:

  1. Django определяет используемый корневой модуль URLconf. Обычно это значение параметра ROOT_URLCONF, но если входящий объект HttpRequest имеет атрибут urlconf (устанавливается обработкой запроса промежуточного программного обеспечения), его значение будет использоваться вместо параметра ROOT_URLCONF.
  2. Django загружает этот модуль Python и ищет переменную urlpatterns. Это должен быть список Python в формате, возвращаемом функцией django.conf.urls.defaults.patterns ().
  3. Django проходит по каждому шаблону URL по порядку и останавливается на первом, соответствующем запрошенному URL.
  4. Как только одно из регулярных выражений совпадает, Django импортирует и вызывает данное представление, которое является простой функцией Python. Представлению передается HttpRequest в качестве первого аргумента и любые значения, захваченные в регулярном выражении в качестве оставшихся аргументов.

Если вы только после полного пути, вы можете попробовать:

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path

Надеюсь, это поможет - оно показывает, как использовать модуль URLconf, и, надеюсь, поможет вам указать правильное направление.

...