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


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

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

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

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

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

7 72

7 ответов:

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

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

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

изменить: применение нового обновления DJANGO

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

Django 1.10 (ссылке)

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

Django 2.0 (ссылке)

The 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-адреса запроса в пространстве имен. В данном случае, Джанго назвал его 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, чтобы вернуть согласованный шаблон (из которого вы можете получить имя шаблона) вместо пар представления и ключевого слова/значения. http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142

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

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

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

обновление: Чем больше я думаю об этом, тем больше я буду препятствовать попытке получить имя urlpattern в a вид. параметры 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.конф.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, и, надеюсь, поможет указать вам в правильном направлении.