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