Spec-Zone.ru › Django 4.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/'

Применённое к выходу функции reverse() дальнейшее кодирование (такое как urllib.parse.quote()) может привести к нежелательным результатам.

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

Ключевые аргументы, которые будут переданы функции представления, извлеченные из URL.

url_name

Имя URL-шаблона, соответствующего URL.

route

Путь соответствующего URL-шаблона.

Например, если path('users/<id>/', ...) — это соответствующий шаблон, то route будет содержать 'users/<id>/'.

tried
Добавлено в Django 3.2.

Список 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()

Обычно для определения 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/4.0/ref/urlresolvers/

Spec-Zone.ru

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