Вспомогательные функции 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 находится в корне своего веб-сервера, то это всегда "/"
.