Spec-Zone.ru › Django 6.0

Вспомогательные функции Django

Пакет django.shortcuts содержит вспомогательные функции и классы, которые охватывают несколько уровней MVC. Другими словами, эти функции и классы обеспечивают контролируемую связанность ради удобства.

render()

render(request, template_name, context=None, content_type=None, status=None, using=None) [исходный код]

Объединяет заданный шаблон с заданным словарём контекста и возвращает объект HttpResponse с отрендеренным текстом.

Django не предоставляет вспомогательную функцию, возвращающую TemplateResponse, поскольку конструктор TemplateResponse обеспечивает такое же удобство, как и render().

Обязательные аргументы

request

Объект запроса, используемый для формирования этого ответа.

template_name

Полное имя используемого шаблона или последовательность имён шаблонов. Если указана последовательность, будет использован первый существующий шаблон. Подробнее о том, как находятся шаблоны, см. в документации по загрузке шаблонов.

Необязательные аргументы

context

Словарь значений, добавляемых в контекст шаблона. По умолчанию это пустой словарь. Если значение в словаре является вызываемым объектом, представление вызовет его непосредственно перед рендерингом шаблона.

content_type

Тип MIME для результирующего документа. По умолчанию — 'text/html'.

status

Код состояния ответа. По умолчанию — 200.

using

NAME используемого движка шаблонов для загрузки шаблона.

Пример

В следующем примере шаблон myapp/index.html рендерится с типом MIME application/xhtml+xml:

from django.shortcuts import render


def my_view(request):
    # View code here...
    return render(
        request,
        "myapp/index.html",
        {
            "foo": "bar",
        },
        content_type="application/xhtml+xml",
    )

Этот пример эквивалентен следующему:

from django.http import HttpResponse
from django.template import loader


def my_view(request):
    # View code here...
    t = loader.get_template("myapp/index.html")
    c = {"foo": "bar"}
    return HttpResponse(t.render(c, request), content_type="application/xhtml+xml")

redirect()

redirect(to, *args, permanent=False, preserve_request=False, **kwargs) [исходный код]

Возвращает HttpResponseRedirect на соответствующий URL для переданных аргументов.

Аргументами могут быть:

  • Модель: будет вызвана функция модели get_absolute_url().
  • Имя представления, возможно, с аргументами: для обратного разрешения имени будет использована функция reverse().
  • Абсолютный или относительный URL, который будет использован без изменений в качестве адреса перенаправления.

По умолчанию выполняется временное перенаправление с кодом состояния 302. Если permanent=True, выполняется постоянное перенаправление с кодом состояния 301.

Если preserve_request=True, ответ указывает пользовательскому агенту сохранить метод и тело исходного запроса при выполнении перенаправления. В этом случае для временного перенаправления используется код состояния 307, а для постоянного — 308. Это нагляднее показано в таблице ниже:

постоянное

сохранить_запрос

код состояния HTTP

True

False

301

False

False

302

False

True

307

True

True

308

Изменено в Django 5.2:

Добавлен аргумент preserve_request.

Примеры

Функцию redirect() можно использовать несколькими способами.

  1. Передать объект; для определения URL перенаправления будет вызван метод объекта get_absolute_url():

    from django.shortcuts import redirect
    
    
    def my_view(request):
        ...
        obj = MyModel.objects.get(...)
        return redirect(obj)
    
  2. Передать имя представления и, при необходимости, позиционные или именованные аргументы; URL будет разрешён обратным поиском с помощью метода reverse():

    def my_view(request):
        ...
        return redirect("some-view-name", foo="bar")
    
  3. Передать жёстко заданный URL для перенаправления:

    def my_view(request):
        ...
        return redirect("/some/url/")
    

    Это также работает с полными URL:

    def my_view(request):
        ...
        return redirect("https://example.com/")
    

По умолчанию функция redirect() выполняет временное перенаправление. Во всех перечисленных выше вариантах можно указать аргумент permanent; если задать значение True, будет возвращено постоянное перенаправление:

def my_view(request):
    ...
    obj = MyModel.objects.get(...)
    return redirect(obj, permanent=True)

Кроме того, аргумент preserve_request позволяет сохранить исходный метод HTTP:

def my_view(request):
    # ...
    obj = MyModel.objects.get(...)
    if request.method in ("POST", "PUT"):
        # Redirection preserves the original request method.
        return redirect(obj, preserve_request=True)
    # ...

get_object_or_404()

get_object_or_404(klass, *args, **kwargs) [исходный код]
aget_object_or_404(klass, *args, **kwargs)

Асинхронная версия: aget_object_or_404()

Вызывает get() у заданного менеджера модели, но вместо исключения DoesNotExist модели вызывает Http404.

Аргументы

klass

Класс Model, Manager или экземпляр QuerySet, из которого нужно получить объект.

*args

Q objects.

**kwargs

Параметры поиска, формат которых должен соответствовать формату, принимаемому get() и filter().

Пример

В следующем примере из MyModel извлекается объект с первичным ключом 1:

from django.shortcuts import get_object_or_404


def my_view(request):
    obj = get_object_or_404(MyModel, pk=1)

Этот пример эквивалентен следующему:

from django.http import Http404


def my_view(request):
    try:
        obj = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404("No MyModel matches the given query.")

Чаще всего передают Model, как показано выше. Однако можно также передать экземпляр QuerySet:

queryset = Book.objects.filter(title__startswith="M")
get_object_or_404(queryset, pk=1)

Пример выше несколько искусственный, поскольку он эквивалентен следующему:

get_object_or_404(Book, title__startswith="M", pk=1)

но такой вариант может быть полезен, если переменная queryset передана вам из другого места.

Наконец, можно также использовать Manager. Это полезно, например, если у вас есть пользовательский менеджер:

get_object_or_404(Book.dahl_objects, title="Matilda")

Можно также использовать related managers:

author = Author.objects.get(name="Roald Dahl")
get_object_or_404(author.book_set, title="Matilda")

Примечание: как и в случае с get(), если найдено более одного объекта, будет вызвано исключение MultipleObjectsReturned.

get_list_or_404()

get_list_or_404(klass, *args, **kwargs) [исходный код]
aget_list_or_404(klass, *args, **kwargs)

Асинхронная версия: aget_list_or_404()

Возвращает результат вызова filter() у заданного менеджера модели, преобразованный в список; если полученный список пуст, вызывает Http404.

Аргументы

klass

Экземпляр Model, Manager или QuerySet, из которого нужно получить список.

*args

Q objects.

**kwargs

Параметры поиска, формат которых должен соответствовать формату, принимаемому get() и filter().

Пример

В следующем примере из MyModel извлекаются все опубликованные объекты:

from django.shortcuts import get_list_or_404


def my_view(request):
    my_objects = get_list_or_404(MyModel, published=True)

Этот пример эквивалентен следующему:

from django.http import Http404


def my_view(request):
    my_objects = list(MyModel.objects.filter(published=True))
    if not my_objects:
        raise Http404("No MyModel matches the given query.")

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/topics/http/shortcuts/

Spec-Zone.ru

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