Пакет django.shortcuts содержит вспомогательные функции и классы “влияющие” на несколько уровней MVC. Другими словами, эти функции упрощают разработку и код.
Выполняет указанный шаблон с переданным словарем контекста и возвращает HttpResponse с полученным содержимым.
Функция render() аналогична вызову функции render_to_response() с аргументом context_instance, который указывает использовать RequestContext.
Django не предоставляет функции для создания TemplateResponse т.к. конструктор TemplateResponse принимает аргументы аналогичные аргументам render().
Объект обрабатываемого запроса
Полное название шаблона, который должен использоваться, или список названий шаблонов. Если передать список, будет использован первый существующий шаблон. Информацию о том, как ищутся шаблоны, смотрите раздел о загрузчике шаблонов.
Словарь переменных для контекста шаблона. По умолчанию, этот словарь пустой. Если значение ключа словаря это функция, она будет вызвана перед выполнением шаблона.
Аргумент context назывался dictionary. Это наименование устарело, начиная с Django 1.8, и будет удалено в Django 1.10.
Экземпляр контекста, который будет использоваться при выполнении шаблона. По умолчанию, шаблон будет обработан с помощью экземпляра RequestContext (со значениями с request и context).
Не рекомендуется, начиная с версии 1.8: Аргумент context_instance устарел. Просто используйте context.
MIME-тип результата. По умолчанию используется значение настройки DEFAULT_CONTENT_TYPE.
Код HTTP статуса ответа. По умолчанию 200.
Указывает приложение, которое содержит данное представление. Подробности смотрите раздел про пространства имен в URL.
Не рекомендуется, начиная с версии 1.8: Аргумент current_app устарел. Используйте request.current_app вместо него.
Параметр конфигурации NAME используется шаблонным движком для загрузки шаблона.
Был добавлен параметр using.
Не рекомендуется, начиная с версии 1.8: Параметр dirs устарел.
Следующий пример выполняет шаблон 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 RequestContext, loader
def my_view(request):
# View code here...
t = loader.get_template('myapp/index.html')
c = RequestContext(request, {'foo': 'bar'})
return HttpResponse(t.render(c),
content_type="application/xhtml+xml")
Выполняет указанный шаблон с переданным словарем контекста и возвращает HttpResponse с полученным содержимым.
Полное название шаблона, который должен использоваться, или список названий шаблонов. Если передать список, будет использован первый существующий шаблон. Обратитесь к документации по загрузке шаблонов для получения информации о методике поиска шаблонов.
Словарь переменных для контекста шаблона. По умолчанию, этот словарь пустой. Если значение ключа словаря это функция, она будет вызвана перед выполнением шаблона.
Аргумент context назывался dictionary. Это наименование устарело, начиная с Django 1.8, и будет удалено в Django 1.10.
Экземпляр контекста, который будет использоваться при выполнении шаблона. По умолчанию, используется экземпляр Context (со значениями с context). Если вам необходимо использовать процессоры контекста, передайте экземпляр RequestContext. Ваш код может выглядеть таким образом:
return render_to_response('my_template.html',
my_context,
context_instance=RequestContext(request))
Не рекомендуется, начиная с версии 1.8: Аргумент context_instance устарел. Просто используйте context.
MIME-тип результата. По умолчанию используется значение настройки DEFAULT_CONTENT_TYPE.
Код HTTP статуса ответа. По умолчанию 200.
Параметр конфигурации NAME используется шаблонным движком для загрузки шаблона.
Были добавлены параметры status и using.
Не рекомендуется, начиная с версии 1.8: Параметр dirs устарел.
Следующий пример выполняет шаблон myapp/index.html и возвращает ответ с MIME-типом application/xhtml+xml:
from django.shortcuts import render_to_response
def my_view(request):
# View code here...
return render_to_response('myapp/index.html', {"foo": "bar"},
content_type="application/xhtml+xml")
Этот пример аналогичен:
from django.http import HttpResponse
from django.template import Context, loader
def my_view(request):
# View code here...
t = loader.get_template('myapp/index.html')
c = Context({'foo': 'bar'})
return HttpResponse(t.render(c),
content_type="application/xhtml+xml")
Возвращает перенаправление(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):
...
object = MyModel.objects.get(...)
return redirect(object)
Передавая название представления и необходимые позиционные или именованные аргументы; 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):
...
object = MyModel.objects.get(...)
return redirect(object, permanent=True)
Вызывает get() для переданного менеджера модели и возвращает полученный объект. Но вызывает исключение Http404 вместо DoesNotExist.
Этот пример получает объект модели MyModel с первичным ключом равным 1:
from django.shortcuts import get_object_or_404
def my_view(request):
my_object = get_object_or_404(MyModel, pk=1)
Этот пример аналогичен:
from django.http import Http404
def my_view(request):
try:
my_object = 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, если запрос вернет несколько объектов.
Возвращает результат метода 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.")
Mar 31, 2016