Как получить текущее имя url с помощью Django?

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

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

EDIT : я знаю, что могу вручную создать url-адрес с помощью get_absolute_url но я бы предпочел избежать этого, так как это часть лекции, и я хотел бы продемонстрировать только один способ построения URL-адреса.

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

правка 2: Еще один случай использования для отображения части шаблона базы différently в соответствии с шаблоном базы. Есть и другие способы для этого (используя CSS и {% block%}, Но когда-то просто приятно иметь возможность удалить тег записи меню базы.html, если имя представления соответствует ссылке.

7 ответов


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

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

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

Edit: применение нового обновления 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

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


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

request.resolver_match.view_name

# return: <namespace>:<url name>

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

request.resolver_match.url_name

Джанго >1.8


уточнение вопроса: "в представлении, как вы получаете имя urlpattern, которое указывает на него, предполагая, что существует ровно один такой urlpattern."

Это может быть желательно по указанным причинам: из представления мы хотим сухой способ получения url-адреса для того же представления (мы не хотим знать наше собственное имя urlpattern).

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

Если вы действительно хотите это сделать, вам нужно будет подкласс RegexURLResolver и изменить метод resolve, чтобы вернуть сопоставленный шаблон (из которого вы можете получить имя шаблона) вместо пар view и keyword/value. 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 выполнить:

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

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

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

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