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


Пакет 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, **kwargs)[исходный код]
Возвращает HttpResponseRedirect на соответствующий URL-адрес для переданных аргументов.

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

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

Примеры:
Вы можете использовать функцию redirect() разными способами.

Передавая некоторый объект; будет вызван метод этого объекта get_absolute_url() для определения 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)[исходный код]
Вызывает get() для данного менеджера модели, но вызывает исключение Http404 вместо DoesNotExist.

Обязательные аргументы
klass
Класс Model, Manager или экземпляр QuerySet из которого получает объект.
**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')
Вы также можете использовать связанные менеджеры:

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)[исходный код]
Возвращает результат filter() для заданного менеджера модели, приведенного к списку, вызывая Http404, если результирующий список пустой.

Обязательные аргументы
klass
Model, Manager или QuerySet, из которого можно получить список.
**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.")