Вспомогательные функции django.urls

reverse()

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

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)[исходный код]

viewname может быть URL pattern name или вызываемым объектом представления. Например, учитывая следующее 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-адреса конкретных экземпляров приложений в соответствии с namespaced URL resolution strategy.

Аргумент urlconf представляет собой модуль URLconf, содержащий шаблоны URL, которые следует использовать для реверсирования. По умолчанию используется корневой URLconf для текущего потока.

Примечание

Строка, возвращаемая reverse(), уже является urlquoted. Например:

>>> 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

Маршрут, соответствующий шаблону 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, то пространства имен будут ['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()[исходный код]

Обычно для определения URL-адресов в вашем приложении всегда следует использовать reverse(). Однако, если ваше приложение само строит часть иерархии URL, вам иногда может понадобиться генерировать URL. В этом случае вам нужно иметь возможность найти базовый URL проекта Django внутри его Web-сервера (обычно reverse() заботится об этом за вас). В этом случае вы можете вызвать get_script_prefix(), который вернет префиксную часть URL вашего проекта Django. Если ваш проект Django находится в корне своего веб-сервера, то это всегда "/".

Вернуться на верх