How to get the current url name using Django?
Я должен построить URL динамически в соответствии с текущим URL. С использованием {% url %}
тег - это самый простой способ сделать это, но мне нужно текущее имя URL для динамического создания нового.
Как я могу получить имя URL, прикрепленное к urlconf, которое ведет к текущему представлению?
РЕДАКТИРОВАТЬ: я знаю, что я могу вручную вручную URL с помощью get_absolute_url
но я бы предпочел этого избегать, так как это часть лекции, и я хотел бы продемонстрировать только один способ создания URL.
Студенты знают, как использовать {% url %}
, Они знают, что сталкиваются с проблемой, когда им нужно сгенерировать более полный URL на основе текущего. Самый простой способ - это использовать {% url %}
опять же, с некоторыми вариациями. Поскольку мы назвали url, нам нужно знать, как получить имя URL, которое вызвало текущее представление.
РЕДАКТИРОВАТЬ 2: другой вариант использования для отображения частей базового шаблона по-разному в соответствии с базовым шаблоном. Есть и другие способы сделать это (используя CSS и {% block %}, но иногда просто приятно иметь возможность удалить тег элемента меню base.html, если имя представления соответствует ссылке.
10 ответов
Я не знаю, как долго эта функция была частью Django, но, как показывает следующая статья, ее можно достичь следующим образом:
from django.core.urlresolvers import resolve
current_url = resolve(request.path_info).url_name
Если вам нужно это в каждом шаблоне, написание шаблона запроса может быть уместным.
Изменить: ПРИМЕНЕНИЕ НОВОГО ДЖАНГО ОБНОВЛЕНИЕ
После текущего обновления 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
Для тех, кто присваивает пространства имен своим шаблонам URL-адресов, вас может заинтересовать имя запроса с пространственным именем. В этом случае Джанго назвал это view_name
вместо.
request.resolver_match.view_name
# return: <namespace>:<url name>
Это может быть достигнуто через:
request.resolver_match.url_name
Джанго>1,8
Просто попробуй request.path
. Это получит текущий запрашиваемый путь.
Уточнение вопроса: "Как вы получаете имя URL-шаблона, указывающего на него, если предположить, что существует только один такой URL-шаблон".
Это может быть желательно по указанным причинам: изнутри представления нам нужен СУХОЙ способ получения URL для того же представления (нам не нужно знать наше собственное имя urlpattern).
Краткий ответ: на самом деле не так просто преподавать свой класс, но вам может быть интересно сделать это через час или два и бросить GitHub.
Если вы действительно хотите это сделать, вам придется создать подкласс RegexURLResolver и изменить метод resolver, чтобы он возвращал сопоставленный шаблон (из которого вы можете получить имя шаблона) вместо пар вида и ключевого слова / значения. http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py
Затем можно создать декоратор или, возможно, более подходящее промежуточное программное обеспечение, которое использует этот подкласс для получения имени шаблона и сохранения этого значения где-то в запросе, чтобы представления могли использовать его.
Если вы действительно хотите это сделать, и у вас возникли какие-то проблемы, дайте мне знать, и я, вероятно, могу помочь.
Для вашего класса я бы просто указал им имя шаблона в представлении или шаблоне. Я считаю, что это приемлемый способ сделать это.
Обновление: чем больше я думаю об этом, тем больше я бы не стал пытаться получить имя urlpattern в представлении. Параметры urlpattern довольно независимы от параметров представления, на которое они указывают. Если вы хотите указать на определенный URL, вам нужно знать, как работает urlpattern, а не только как работает представление. Если вам нужно знать, как работает urlpattern, вам также может быть необходимо знать имя urlpattern.
Чтобы получить абсолютный URL-адрес, сделайте следующее:
request.build_absolute_uri()
Если вы хотите добавить что-то дополнительное в конце основного URL-адреса (не текущего URL-адреса), сделайте следующее:
request.build_absolute_uri("/something/")
Если вы хотите получить URL-адрес единственного основного домена, сделайте следующее:
request.build_absolute_uri("/")
Это немного неясно из вашего вопроса, но 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/
Я надеюсь, что это поможет - это показывает, как использовать модуль URLconf, и, надеюсь, поможет указать вам правильное направление.
Например,my_app1
иindex
настроены наapp_name
иname
соответственно вmy_app1/urls.py
как показано ниже:
# "my_app1/urls.py"
from django.urls import path
from . import views
app_name = "my_app1" # Here
urlpatterns = [ # Here
path('', views.index, name="index")
]
Затем вы можете получить пространство имен URL и его отдельно вmy_app1/views.py
как показано ниже:
# "my_app1/views.py"
from django.shortcuts import render
def index(request):
print(request.resolver_match.view_name) # my_app1:index
print(request.resolver_match.app_name) # my_app1
print(request.resolver_match.url_name) # index
return render(request, 'index.html')
Затем вы можете получить пространство имен URL и его отдельно вtemplates/index.html
как показано ниже:
{# "templates/index.html" #}
{{ request.resolver_match.view_name }} {# my_app1:index #}
{{ request.resolver_match.app_name }} {# my_app1 #}
{{ request.resolver_match.url_name }} {# index #}