Spec-Zone.ru › Django 3.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

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

url_name

Имя шаблона URL, который соответствует URL.

route

Маршрут сопоставленного шаблона URL.

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

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/3.1/ref/urlresolvers/

Spec-Zone.ru

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