24. Механизм представлений в Django.
- Представление - (view, вид) - функция на языке Python, в Django с помощью их реализуются обработчики запросов.
- Принимает на вход объект-запрос (django.http.HttpRequest) и возвращает объект-ответ (django.http.HttpResponse).
- Ответ должен задаваться во view, обычно он генерирует html.
Вспомогательные функции
- Лежат в django.shortcuts.
- Позволяют упростить ряд рутинных или часто нужных действий.
render
Рендерит шаблон и создаёт сооветствующий HttpResponse.
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")
redirect
Позволяет выполнить редирект путём возвращения специального ответа, создает HttpResponseRedirect на соответствующий url.
from django.shortcuts import redirect def my_view(request): ... object = MyModel.objects.get(...) return redirect(object) ------------------------------------------------------------------------------- def my_view(request): ... return redirect('some-view-name', foo='bar') ------------------------------------------------------------------------------- def my_view(request): ... return redirect('/some/url/') ------------------------------------------------------------------------------- def my_view(request): ... return redirect('http://example.com/')
get_object_or_404
Оборачивает получение объекта из базы (get): если не найдет, то вернёт ответ 404.
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.") ------------------------------------------------------------------------------- queryset = Book.objects.filter(title__startswith='M') get_object_or_404(queryset, pk=1)
get_list_or_404
Как предыдущий, только для нескольких объектов (filter).
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.")