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

Применение дальнейшего кодирования (например, 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
Новое в 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()

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

Spec-Zone.ru

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