Spec-Zone.ru › Django 4.1

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

Spec-Zone.ru

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