Spec-Zone.ru › Django 5.0

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

Ключевые аргументы, полученные из 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 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/5.0/ref/urlresolvers/

Spec-Zone.ru

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