Функции django.urls для работы с URL
Функция обратного преобразования URL
Функция `reverse` может использоваться для возвращения абсолютного пути к заданному представлению и необязательным параметрам, аналогично тегу url:
- Функция `reverse` [source]
Аргумент `viewname` может быть именем URL-шаблона или вызываемым объектом представления, используемым в URLconf. Например, при следующей конфигурации 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` позволяет указать решателю намек, к какому приложению относится текущее представление. Этот аргумент используется для разрешения имен пространств приложений в URL на конкретных экземплярах приложений в соответствии со стратегией разрешения именованных URL.
Аргумент `urlconf` — это модуль URLconf, содержащий URL-шаблоны, которые нужно использовать для обратного преобразования. По умолчанию используется корневой URLconf для текущей нити.
Ключевое слово `args` позволяет добавить параметры в возвращаемый URL. Оно может принимать экземпляр `QueryDict` (такой как request.GET) или любое значение, совместимое с `urlencode`. Кодированная строка запроса добавляется к результирующему URL, предваряясь символом ?.
Ключевое слово `fragment` определяет идентификатор фрагмента, который будет добавлен к возвращаемому URL (после пути и строки запроса, предваряясь #).
Например:
>>> from django.urls import reverse
>>> reverse("admin:index", query={"q": "biscuits", "page": 2}, fragment="results")
'/admin/?q=biscuits&page=2#results'
>>> reverse("admin:index", query=[("color", "blue"), ("color", 1), ("none", None)])
'/admin/?color=blue&color=1&none=None'
>>> reverse("admin:index", query={"has empty spaces": "also has empty spaces!"})
'/admin/?has+empty+spaces=also+has+empty+spaces%21'
>>> reverse("admin:index", fragment="no encoding is done")
'/admin/#no encoding is done'
Были добавлены аргументы `current_app` и `urlconf`.
Примечание
Строка, возвращаемая функцией `reverse`, уже кодирована URL-символами. Например:
>>> reverse("cities", args=["Orléans"])
'.../Orl%C3%A9ans/'
Применение дополнительных кодировок (например, `quote`) к результату функции `reverse` может привести к нежелательным последствиям.
Обратное преобразование представлений на основе классов по объекту представления
Объект представления также может быть результатом вызова `as_view`, если этот же объект представления используется в URLConf. В соответствии с первоначальным примером, объект представления может быть определён как:
news/views.pyfrom django.views import View class ArchiveView(View): ... archive = ArchiveView.as_view()
Однако, помните, что именованные представления не могут быть обработаны по объекту представления.
Функция `reverse_lazy`
Ленивая (отложенная) версия функции `reverse()`.
- Функция `reverse_lazy`
Она полезна, когда необходимо использовать обратное преобразование URL перед загрузкой URLConf проекта. Типичные случаи использования этой функции:
- передача обратного преобразования URL в качестве атрибута `url` класса представления на основе классов.
- передача обратного преобразования URL в декоратор (например, как аргумент `url` для декоратора `permission_required`).
- передача обратного преобразования URL в качестве значения по умолчанию для параметра в сигнатуре функции.
resolve()
Функция resolve() может использоваться для разрешения путей URL до соответствующих функций представления. Она имеет следующий вид:
-
resolve(path, urlconf=None)[source]
path — это путь URL, который вы хотите разрешить. Как и в случае с reverse(), вам не нужно беспокоиться о параметре urlconf. Функция возвращает объект ResolverMatch, который позволяет получить доступ к различным метаданным о разрешённом URL.
Если URL не разрешается, функция вызывает исключение Resolver404 (подкласс Http404).
-
class ResolverMatch[source] -
-
func -
Функция представления, которая будет использоваться для обработки URL
-
args -
Аргументы, которые будут переданы функции представления, разобранные из URL.
-
kwargs -
Все именованные аргументы, которые будут переданы функции представления, т.е.
captured_kwargsиextra_kwargs.
-
captured_kwargs -
Захваченные именованные аргументы, которые будут переданы функции представления, разобранные из URL.
-
extra_kwargs -
Дополнительные именованные аргументы, которые будут переданы функции представления.
-
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 urlsplit
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(urlsplit(next).path)
kwargs["request"] = request
try:
view(*args, **kwargs)
except Http404:
return HttpResponseRedirect("/")
return response
get_script_prefix()
-
get_script_prefix()[source]
Обычно для определения URL в приложении следует всегда использовать reverse(). Однако, если ваше приложение само конструирует часть иерархии 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/5.2/ref/urlresolvers/