Вспомогательные функции 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
TrueFalse301
FalseFalse302
FalseTrue307
TrueTrue308
Изменено в Django 5.2:Добавлен аргумент
preserve_request. - Модель: будет вызвана функция модели
Примеры
Функцию redirect() можно использовать несколькими способами.
-
Передать объект; для определения URL перенаправления будет вызван метод объекта
get_absolute_url():from django.shortcuts import redirect def my_view(request): ... obj = MyModel.objects.get(...) return redirect(obj) -
Передать имя представления и, при необходимости, позиционные или именованные аргументы; URL будет разрешён обратным поиском с помощью метода
reverse():def my_view(request): ... return redirect("some-view-name", foo="bar") -
Передать жёстко заданный 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.
Аргументы
Пример
В следующем примере из 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.
Аргументы
Пример
В следующем примере из 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/