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

https://docs.djangoproject.com/en/dev/ref/request-response/

Для тех, кто присваивает пространства имен своим шаблонам 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 выполнить:

  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/

Я надеюсь, что это поможет - это показывает, как использовать модуль 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 #}
Другие вопросы по тегам