Spec-Zone.ru › Django 5.1

django.urls служебные функции

reverse()

Если вам нужно использовать что-то подобное тегу шаблона url в вашем коде, Django предоставляет следующую функцию:

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None) [source]

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) [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 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() [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.1/ref/urlresolvers/

Spec-Zone.ru

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