• 3.1
  • 3.2
  • 5.0
  • Версия документации: 6.1

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

Пакет 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-тип результата. По умолчанию используется значение настройки DEFAULT_CONTENT_TYPE.

status

Код HTTP статуса ответа. По умолчанию 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().

  • Название представления, возможно с аргументами: для вычисления URL-а будет использоваться функция urlresolvers.reverse.

  • Абсолютный или относительный URL, который будет использован для перенаправления на указанный адрес.

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

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

постоянный

save_request

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

Правда

Ложь

301

Ложь

Ложь

302

Ложь

Правда

307

Правда

Правда

308

Changed in 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)
    # ...

resolve_url()

resolve_url(to, *args, **kwargs)

Возвращает строку URL-адреса путем разрешения и нормализации данного аргумента to в конкретный URL-адрес. Параметр to может быть:

  • Объект, реализующий get_absolute_url(), и в этом случае будет вызван метод и возвращен его результат.

  • Имя представления, функция представления или класс представления, возможно, с аргументами, передаваемыми как *args и **kwargs, и в этом случае reverse() будет использоваться для обратного разрешения представления.

  • Строка URL, которая будет возвращена без изменений.

Эта функция используется внутри ярлыка redirect() для определения целевого URL-адреса места перенаправления.

Примеры

  1. Разрешение URL-адреса модели, которая определяет get_absolute_url():

    models.py
    from django.db import models
    from django.urls import reverse
    
    
    class Article(models.Model):
        title = models.CharField(max_length=100)
    
        def get_absolute_url(self):
            return reverse("article-detail", args=[self.pk])
    
    views.py
    from django.http import JsonResponse
    from django.shortcuts import get_object_or_404, resolve_url
    from .models import Article
    
    
    def article_api_view(request, pk):
        """Return metadata about an article, including its canonical URL."""
        article = get_object_or_404(Article, pk=pk)
        return JsonResponse(
            {
                "id": article.pk,
                "title": article.title,
                "url": resolve_url(article),
            }
        )
    
  2. Разрешение целевого URL-адреса для использования вне перенаправления, например, в заголовке ответа HTTP:

    from django.conf import settings
    from django.http import HttpResponse
    from django.shortcuts import resolve_url
    
    
    def login_success(request):
        response = HttpResponse("Login successful")
        response["X-Next-URL"] = resolve_url(settings.LOGIN_REDIRECT_URL)
        return response
    

get_object_or_404

get_object_or_404(klass, *args, **kwargs)
aget_object_or_404(klass, *args, **kwargs)

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

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

Аргументы

klass

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

*args

Q объекты.

**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")

Можно использовать менеджер отношений между моделями:

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 объекты.

**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.")
Back to Top