Как получить текущее urlname с помощью Django?
Мне нужно создать URL-адрес динамически в соответствии с текущим URL-адресом. Использование тега {% url %}
- это самый простой способ сделать это, но мне нужно текущее имя url для генерации нового динамически.
Как я могу получить имя url, прикрепленное к urlconf, которое приводит к текущему виду?
EDIT: Я знаю, что могу вручную манипулировать URL-адресом с помощью get_absolute_url
, но я бы предпочел избежать его, поскольку это часть лекции, и я хотел бы продемонстрировать только один способ создания URL-адресов.
Студенты знают, как использовать {% url %}
. Они знают, что сталкиваются с проблемой, когда им приходится генерировать более полный URL-адрес на основе текущего. Самый простой способ - снова использовать {% url %}
с некоторыми вариантами. Поскольку мы назвали url, , нам нужно знать, как получить имя URL-адреса, вызывающего текущий вид.
РЕДАКТИРОВАТЬ 2: другой вариант использования - отображать части базового шаблона в соответствии с базовым шаблоном. Есть и другие способы сделать это (используя CSS и {% block%}, но когда-то просто было приятно удалить тег входа в меню base.html, если имя вида соответствует ссылке.
Ответы
Ответ 1
Я не знаю, как долго эта функция была частью Django, но, как показывает в следующей статье, ее можно достичь следующим образом: вид:
from django.core.urlresolvers import resolve
current_url = resolve(request.path_info).url_name
Если вам это нужно в каждом шаблоне, может потребоваться запись запроса шаблона.
Ответ 2
Как и в Django 1.5, к нему можно получить доступ из объекта запроса
current_url = request.resolver_match.url_name
https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.resolver_match
Ответ 3
Для тех, кто использует свои шаблоны URL-адресов, вы можете быть заинтересованы в имени URL-адреса, указанном в имени. В этом случае Django называл его view_name
.
request.resolver_match.view_name
# return: <namespace>:<url name>
Ответ 4
Это может быть достигнуто с помощью:
request.resolver_match.url_name
Django > 1.8
Ответ 5
Разъяснение вопроса: "В представлении, как вы получаете имя urlpattern, которое указывает на него, предполагая, что существует ровно один такой urlpattern."
Это может быть желательно по указанным причинам: изнутри представления нам нужен СУХОЙ способ получить URL-адрес для одного и того же представления (мы не хотим знать свое собственное имя URL-адреса).
Короткий ответ: Это не так просто, чтобы научить ваш класс, но это может быть забавным для вас сделать через час или два и бросить на GitHub.
Если вы действительно хотели это сделать, вам придется подклассировать RegexURLResolver и изменить метод разрешения, чтобы вернуть сопоставленный шаблон (из которого вы можете получить имя шаблона) вместо пар представлений и ключевых слов/значений.
http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142
Затем вы можете создать декоратор или, возможно, более подходящее промежуточное программное обеспечение, которое использует этот подкласс, чтобы получить имя шаблона и сохранить это значение где-нибудь в запросе, чтобы представления могли его использовать.
Если вы на самом деле хотите это сделать, и вы столкнетесь с некоторыми проблемами, сообщите мне, и я, вероятно, смогу помочь.
Для вашего класса я просто хотел бы, чтобы они упорядочили имя шаблона в представлении или шаблоне. Я считаю, что это приемлемый способ сделать это.
Update:
Чем больше я думаю об этом, тем больше я буду препятствовать попытке получить имя URL-адреса в представлении. Параметры urlpattern довольно независимы от параметров точки зрения, на которую они указывают. Если вы хотите указать на определенный URL-адрес, вам нужно знать, как работает urlpattern, а не только то, как работает представление. Если вам нужно знать, как работает urlpattern, вам также может понадобиться знать имя URL-адреса.
Ответ 6
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
Ответ 7
Немного непонятно из вашего вопроса, но 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.urls.defaults.patterns().
- Django запускает каждый шаблон URL по порядку и останавливается на первом, который соответствует запрошенному URL.
- Как только одно из регулярных выражений совпадает, Django импортирует и вызывает данное представление, которое является простой функцией Python. В представлении передается HttpRequest в качестве его первого аргумента и любых значений, записанных в регулярном выражении в качестве оставшихся аргументов.
Если вы только после полного пути, вы можете попробовать:
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
Я надеюсь, что это поможет - он указывает, как использовать модуль URLconf, и, надеюсь, поможет вам указать в правильном направлении.