Spec-Zone.ru › Django 1.9

django.core.urlresolvers служебные функции

reverse()

Если вам нужно использовать что-то подобное тегу шаблона url в вашем коде, Django предоставляет следующую функцию:

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None) [source]

viewname может быть строкой, содержащей путь к объекту представления в Python, именем URL-шаблона или вызываемым объектом представления. Например, с учетом следующего url:

from news import views

url(r'^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.core.urlresolvers 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 для текущей нити.

Устарело начиная с версии 1.8: Возможность обратного преобразования с использованием пути Python, например reverse('news.views.archive'), устарела.

Убедитесь, что все ваши представления правильные.

В процессе определения, какие имена URL соответствуют каким шаблонам, функция reverse() должна импортировать все ваши файлы URLconf и изучить имя каждого представления. Это включает импорт каждой функции представления. Если при импорте какой-либо из ваших функций представления возникнут какие-либо ошибки, это приведет к тому, что reverse() выдаст ошибку, даже если эта функция представления не является той, которую вы пытаетесь обращать.

Убедитесь, что все представления, на которые вы ссылаетесь в своих файлах URLconf, существуют и могут быть импортированы правильно. Не включайте строки, которые ссылаются на представления, которые вы еще не написали, так как эти представления не будут импортируемы.

Примечание

Строка, возвращаемая reverse(), уже urlquoted. Например:

>>> reverse('cities', args=['Orléans'])
'.../Orl%C3%A9ans/'

Применение дальнейшего кодирования (например, urlquote() или urllib.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) [source]

path — это путь URL, который вы хотите разрешить. Как и в случае с reverse(), вам не нужно беспокоиться о параметре urlconf. Функция возвращает объект ResolverMatch, позволяющий получить доступ к различным метаданным о разрешенном URL.

Если URL не разрешается, функция вызывает исключение Resolver404 (подкласс Http404).

class ResolverMatch [source]
func

Функция представления, которая будет использоваться для обработки URL

args

Аргументы, которые будут переданы функции представления, разобранные из URL.

kwargs

Ключевые аргументы, которые будут переданы функции представления, разобранные из URL.

url_name

Имя 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, тогда namespaces будут ['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 django.core.urlresolvers import resolve
from django.http import HttpResponseRedirect, Http404
from django.utils.six.moves.urllib.parse import urlparse

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() [source]

Обычно вы всегда должны использовать reverse() для определения URL в вашем приложении. Однако, если ваше приложение само создает часть иерархии URL, вам иногда может потребоваться сгенерировать URL-адреса. В этом случае вам нужно определить базовый URL-адрес проекта Django в веб-сервере (обычно, reverse() позаботится об этом за вас). В этом случае вы можете вызвать get_script_prefix(), который вернет часть префикса скрипта URL-адреса для вашего проекта Django. Если ваш проект Django находится в корне веб-сервера, это всегда "/".

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.9/ref/urlresolvers/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API