Spec-Zone.ru › Django 2.2

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

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

url_name

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

route
Добавлен в Django 2.2.

Путь соответствующего 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() [source]

Обычно вы всегда должны использовать 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/2.2/ref/urlresolvers/

Spec-Zone.ru

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