Spec-Zone.ru › Django 1.11

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

Список отдельных компонентов пространства имен приложения в полном имени пространства приложения для 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.11/ref/urlresolvers/

Spec-Zone.ru

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