Spec-Zone.ru › Django 4.2

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/

Spec-Zone.ru

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