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 находится в корне своего веб-сервера, это всегда "/"
.