Spec-Zone.ru › Django 5.2

Функции 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'
Изменено в Django 5.2:

Были добавлены аргументы `current_app` и `urlconf`.

Примечание

Строка, возвращаемая функцией `reverse`, уже кодирована URL-символами. Например:

>>> reverse("cities", args=["Orléans"])
'.../Orl%C3%A9ans/'

Применение дополнительных кодировок (например, `quote`) к результату функции `reverse` может привести к нежелательным последствиям.

Обратное преобразование представлений на основе классов по объекту представления

Объект представления также может быть результатом вызова `as_view`, если этот же объект представления используется в URLConf. В соответствии с первоначальным примером, объект представления может быть определён как:

news/views.py
 from 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API