it-swarm.com.ru

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

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

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

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

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

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

77
e-satis

Я не знаю, как долго эта функция была частью 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 ( ссылка )

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

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

from Django.urls import resolve
current_url = resolve(request.path_info).url_name
106
Lukas Bünger

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

    current_url = request.resolver_match.url_name

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

100
Bharathwaaj

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

request.resolver_match.view_name

# return: <namespace>:<url name>
20
Yeo

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

request.resolver_match.url_name

Джанго> 1,8

9
niespodd

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

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

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

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

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

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

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

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

3
Conley Owens
1
gruszczy

Это немного неясно из вашего вопроса, но 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, и, надеюсь, поможет вам в правильном направлении.

0
Mark Mayo