Как получить текущее имя 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>
уточнение вопроса: "в представлении, как вы получаете имя 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 выполнить:
- Django определяет корневой модуль URLconf для использования. Обычно это значение параметра ROOT_URLCONF, но если входящий объект HttpRequest имеет атрибут urlconf (заданный обработкой запросов промежуточного программного обеспечения), его значение будет использоваться вместо параметра ROOT_URLCONF.
- Django загружает этот модуль Python и ищет переменную urlpatterns. Это должен быть список Python в формате, возвращаемом функцией django.conf.URL-адреса.по умолчанию.росчерки.)(
- Django проходит через каждый шаблон URL, в порядке и останавливается на первом, который соответствует запрошенному URL-адресу.
- как только одно из регулярных выражений совпадает, Django импортирует и вызывает данное представление, которое является простой функцией Python. Представление получает HttpRequest в качестве первого аргумента и любые значения, захваченные в регулярном выражении в качестве оставшихся аргументов.
Если вы сразу после полного пути, вы можете попробуйте:
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
Я надеюсь, что это поможет-он указывает, как использовать модуль URLconf, и, надеюсь, поможет указать вам в правильном направлении.