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 and extra_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 "/".

Вернуться на верх