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
¶ All keyword arguments that would be passed to the view function, i.e.
captured_kwargs
andextra_kwargs
.
-
captured_kwargs
¶ - New in Django Development version.
The captured keyword arguments that would be passed to the view function, as parsed from the URL.
-
extra_kwargs
¶ - New in Django Development version.
The additional keyword arguments that would be passed to the view function.
-
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
()[исходный код]¶
Normally, you should always use reverse()
to define URLs
within your application. However, if your application constructs part of the
URL hierarchy itself, you may occasionally need to generate URLs. In that
case, you need to be able to find the base URL of the Django project within
its web server (normally, reverse()
takes care of this for
you). In that case, you can call get_script_prefix()
, which will return
the script prefix portion of the URL for your Django project. If your Django
project is at the root of its web server, this is always "/"
.