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
¶ Все аргументы ключевых слов, которые будут переданы в функцию представления, т.е.
captured_kwargs
иextra_kwargs
.
-
captured_kwargs
¶ Захваченные аргументы ключевых слов, которые будут переданы функции представления, как разобранные из URL.
-
extra_kwargs
¶ Дополнительные аргументы ключевого слова, которые будут переданы в функцию представления.
-
url_name
¶ Имя шаблона URL, который соответствует URL.
-
route
¶ Маршрут, соответствующий шаблону URL.
Например, если
path('users/<id>/', ...)
является совпадающим шаблоном,route
будет содержать'users/<id>/'
.
-
tried
¶ Список шаблонов 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
()[исходный код]¶
Обычно для определения URL-адресов внутри приложения всегда следует использовать reverse()
. Однако, если ваше приложение само строит часть иерархии URL, вам иногда может понадобиться генерировать URL. В этом случае вам нужно уметь находить базовый URL проекта Django внутри его веб-сервера (обычно reverse()
заботится об этом за вас). В этом случае вы можете вызвать get_script_prefix()
, который вернет префиксную часть URL вашего проекта Django. Если ваш проект Django находится в корне своего веб-сервера, то это всегда "/"
.
Предупреждение
Эта функция не может использоваться вне цикла «запрос-ответ», поскольку она опирается на значения, инициализированные в этом цикле.