Spec-Zone.ru › Django 2.1

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.

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

Spec-Zone.ru

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