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

Примечание

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

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

resolve()

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

resolve( путь , urlconf = None )

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

tried
Новое в Django 3.2.

Список шаблонов 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, то пространства имен будут .['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()

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

Copyright ©2021 All rights reserved