Spec-Zone.ru › Django 1.10

django.urls служебные функции

Устарело начиная с версии 1.10: В более старых версиях эти функции находятся в django.core.urlresolvers. Импорт из старого расположения будет продолжать работать до Django 2.0.

reverse()

Если вам нужно использовать что-то подобное тегу шаблона url в вашем коде, Django предоставляет следующую функцию:

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None) [source]

viewname может быть именем URL-шаблона или вызываемым объектом представления. Например, при следующих url:

from news import views

url(r'^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/'

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

Список отдельных компонентов пространства имен приложения в полном пространстве имен приложения для 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 django.urls import resolve
from django.http import HttpResponseRedirect, Http404
from django.utils.six.moves.urllib.parse import urlparse

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

Spec-Zone.ru

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