Spec-Zone.ru › Django 1.8

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() уже кодирована в URL. Например:

>>> 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.

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.8/ref/urlresolvers/

Spec-Zone.ru

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