Служебные функции 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 - это модуль конфигурации URL-адреса, содержащий шаблоны URL-адресов, используемые для разрешения. По умолчанию используется конфигурация корневого URL-адреса текущего потока.

Заметка

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

>>> 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 перед загрузкой конфигурации URL. Вот несколько распространенных случаев использования этой функции:

  • Назначение обратного URL-адреса в качестве атрибута url общего представления на основе классов.
  • присвоение обратного URL-адреса декоратору (как для параметра login_url декоратора django.contrib.auth.decorators.permission_required() ).
  • назначение обратного URL-адреса в качестве значения по умолчанию параметра в сигнатуре функции.

resolve()

Функцию resolve() можно использовать для разрешения пути URL к соответствующей функции просмотра. Его подпись следующая:

resolve( путь , urlconf = Нет )

path - это URL-адрес для разрешения. Как и в случае с reverse() настройками, беспокоиться не о чем urlconf . Фокус возвращает объект, ResolverMatch позволяющий получить доступ к различным метаданным о разрешенном URL.

Если URL-адрес не разрешен, функция генерирует исключение Resolver404 (которое является подклассом Http404 ).

класс 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 , 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/')

Одним из возможных вариантов использования for 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. Если этот проект размещен в корне своего веб-сервера, значение всегда будет "/" .

Copyright ©2020 All rights reserved