django.urls служебные функции
reverse()
Если вам нужно использовать что-то подобное тегу шаблона url в вашем коде, Django предоставляет следующую функцию:
-
reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
viewname может быть именем URL-шаблона или вызываемым объектом представления. Например, учитывая следующее url:
from news import views
path("archive/", views.archive, name="news-archive")
вы можете использовать любой из следующих способов для обратной ссылки на URL:
# using the named URL
reverse("news-archive")
# passing a callable object
# (This is discouraged because you can't reverse namespaced views this way.)
from news import views
reverse(views.archive)
Если URL принимает аргументы, вы можете передать их args. Например:
from django.urls import reverse
def myview(request):
return HttpResponseRedirect(reverse("arch-summary", args=[1945]))
Вы также можете передать kwargs вместо args. Например:
>>> reverse("admin:app_list", kwargs={"app_label": "auth"})
'/admin/auth/'
args и kwargs не могут быть переданы в reverse() одновременно.
Если соответствие не найдено, reverse() генерирует исключение NoReverseMatch.
Функция reverse() может обращать множество регулярных выражений для URL, но не все возможные. Основное ограничение на данный момент заключается в том, что шаблон не может содержать альтернативные варианты с помощью вертикальной черты ("|") символа. Вы можете спокойно использовать такие шаблоны для сопоставления входящих URL и отправки их в представления, но вы не можете обращать такие шаблоны.
Аргумент current_app позволяет предоставить подсказку решателю, указывая приложение, к которому относится текущее выполняемое представление. Этот current_app аргумент используется в качестве подсказки для разрешения имен пространств приложений в URL на конкретных экземплярах приложений в соответствии со стратегией разрешения URL-имен пространств.
Аргумент urlconf — модуль URLconf, содержащий URL-шаблоны, используемые для обратной ссылки. По умолчанию используется корневой URLconf для текущей нити.
Примечание
Строка, возвращаемая функцией reverse(), уже кодирована в URL. Например:
>>> reverse("cities", args=["Orléans"])
'.../Orl%C3%A9ans/'
Применение дальнейшего кодирования (например, urllib.parse.quote()) к выводу функции reverse() может привести к нежелательным результатам.
reverse_lazy()
Ленивая версия функции reverse().
-
reverse_lazy(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
Это полезно, когда вам нужно использовать обратную ссылку на URL до загрузки URLconf вашего проекта. Некоторые распространенные случаи, когда эта функция необходима:
- предоставление обратной ссылки на URL в качестве атрибута
urlобобщенного представления на основе класса. - предоставление обратной ссылки на URL в декоратор (такой как аргумент
login_urlдля декоратораdjango.contrib.auth.decorators.permission_required()). - предоставление обратной ссылки на URL в качестве значения по умолчанию для параметра в сигнатуре функции.
resolve()
Функция resolve() может использоваться для разрешения путей URL до соответствующих функций представлений. Она имеет следующий синтаксис:
-
resolve(path, urlconf=None)
path — это путь URL, который вы хотите разрешить. Как и с функцией reverse(), вам не нужно беспокоиться об аргументе urlconf. Функция возвращает объект ResolverMatch, который позволяет получить доступ к различным метаданным о разрешенном URL.
Если URL не может быть разрешен, функция генерирует исключение Resolver404 (подкласс Http404).
-
class ResolverMatch -
-
func -
Функция представления, которая будет использоваться для обработки URL
-
args -
Аргументы, которые будут переданы функции представления, разобранные из URL.
-
kwargs -
Все ключевые аргументы, которые будут переданы функции представления, т.е.
captured_kwargsиextra_kwargs.
-
captured_kwargs -
Добавлен в Django 4.1.
Захваченные ключевые аргументы, которые будут переданы функции представления, разобранные из URL.
-
extra_kwargs -
Добавлен в Django 4.1.
Дополнительные ключевые аргументы, которые будут переданы функции представления.
-
url_name -
Имя URL-шаблона, соответствующего URL.
-
route -
Путь соответствия URL-шаблона.
Например, если
path('users/<id>/', ...)— это соответствующий шаблон,routeбудет содержать'users/<id>/'.
-
tried -
Список URL-шаблонов, которые были проверены до того, как URL либо совпал с одним из них, либо были исчерпаны доступные шаблоны.
-
app_name -
Пространство имен приложения для URL-шаблона, соответствующего URL.
-
app_names -
Список отдельных компонентов пространства имен приложения в полном пространстве имен приложения для URL-шаблона, соответствующего URL. Например, если
app_name— это'foo:bar', тогдаapp_namesбудет['foo', 'bar'].
-
namespace -
Пространство имен экземпляра для URL-шаблона, соответствующего URL.
-
namespaces -
Список отдельных компонентов пространства имен экземпляра в полном пространстве имен экземпляра для URL-шаблона, соответствующего URL. То есть, если пространство имен
foo:bar, то namespaces будет['foo', 'bar'].
-
view_name -
Имя представления, которое соответствует URL, включая пространство имен, если оно есть.
-
Объект ResolverMatch может быть затем проинтерпретирован для получения информации о URL-шаблоне, соответствующем URL:
# Resolve a URL
match = resolve("/some/path/")
# Print the URL pattern that matches the URL
print(match.url_name)
Объект ResolverMatch также может быть назначен тройке:
func, args, kwargs = resolve("/some/path/")
Одно из возможных применений функции resolve() — это проверка того, вызовет ли представление ошибку Http404 перед переадресацией к нему:
from urllib.parse import urlparse
from django.urls import resolve
from django.http import Http404, HttpResponseRedirect
def myview(request):
next = request.META.get("HTTP_REFERER", None) or "/"
response = HttpResponseRedirect(next)
# modify the request and response as required, e.g. change locale
# and set corresponding locale cookie
view, args, kwargs = resolve(urlparse(next)[2])
kwargs["request"] = request
try:
view(*args, **kwargs)
except Http404:
return HttpResponseRedirect("/")
return response
get_script_prefix()
-
get_script_prefix()
Обычно вы всегда должны использовать функцию reverse() для определения URL в вашем приложении. Однако, если ваше приложение само строит часть иерархии URL, вам иногда может потребоваться сгенерировать URL. В этом случае вам нужно получить базовый URL проекта Django в веб-сервере (обычно reverse() позаботится об этом за вас). В этом случае вы можете вызвать функцию get_script_prefix(), которая вернет часть префикса скрипта URL для вашего проекта Django. Если ваш проект Django находится в корне веб-сервера, это всегда "/".
Предупреждение
Эта функция не может использоваться вне цикла запроса-ответа, так как она опирается на значения, инициализированные во время этого цикла.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.2/ref/urlresolvers/