Вспомогательные функции¶
Пакет 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_typeMIME-тип результата. По умолчанию используется значение настройки
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, **kwargs)¶
Возвращает перенаправление(
HttpResponseRedirect) на URL указанный через аргументы.В аргументах можно передать:
Экземпляр модели: как URL будет использоваться результат вызова метода
get_absolute_url().Название представления, возможно с аргументами: для вычисления URL-а будет использоваться функция
urlresolvers.reverse.Абсолютный или относительный URL, который будет использован для перенаправления на указанный адрес.
По умолчанию использует временное перенаправление, используйте аргумент
permanent=Trueдля постоянного перенаправления.
Примеры¶
Функцию 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)
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.
Аргументы¶
Примеры¶
Этот пример получает объект модели 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, если запрос вернет несколько объектов.
Добавлена функция 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если получен пустой список.
Аргументы¶
Примеры¶
Этот пример получает все опубликованные объекты модели``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.")
Добавлена функция aget_list_or_404().