Spec-Zone.ru › Django 5.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
Имя движка шаблонов для загрузки шаблона.

Пример

Следующий пример рендерит шаблон 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, **kwargs)

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

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

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

По умолчанию выполняется временное перенаправление; передайте permanent=True для выполнения постоянного перенаправления.

Примеры

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

  1. Передавая объект; будет вызван метод get_absolute_url() этого объекта для определения 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)

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 objects.
**kwargs
Параметры поиска, которые должны быть в формате, принятом get() и filter().

Пример

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

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 будет поднято, если найдено более одного объекта.

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

Добавлена функция aget_object_or_404().

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 5.0:

Добавлена функция aget_list_or_404().

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

Spec-Zone.ru

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