Контроллеры Django

Контроллеры-функция
Разработка и описание контроллеров Django
Функция контроллер (views) - это функция, которая принимает веб-запрос и возвращает ответ. Ответ может быть:
  • содержимым HTML-страницы
  • Перенаправлением
  • ошибкой
  • XML - документом
  • и т. д.
Функция запускается при получении клиентского запроса по определённому адресу. Она принимает экземпляр класса HttpRequest, который хранит сведенья клиентского запроса (request). Сведенья - это набор именованных параметров, имена совпадают с именами URL-параметров.

Функция возвращает экземпляр класса:
HttpResponse - низкоуровневый объект ответа
TemplateResponse - объект ответа на основе шаблона
HttpResponseRedirect - перенаправление
FileResponse - для отправки файлов
JsonResponse - для отправки данных в формате JSON
StreamingThhpResponse - потоковый ответ
Различные классы ошибок
СОкращения Django
В Django созданы функции, которые выполняют сразу несколько действий. Данные функции наследуются от django.shortcuts

Функции:

render - выполняет рендеринг шаблона страницы с указанными параметрами и отправку ее пользователю.
redirect - перенаправляет на другую страницу и может выполнить определенные действия
get_object_or_404 - поиск записи по указанным условиям. Возвращает запись или исключение Http404. Если объектов несколько возбуждает исключение
get_list_or_404 - поиск записей по указанным условиям. Возвращает список записей или исключение Http404.
Пример
def index(request):
    template = 'posts/index.html'
    post_list = Post.objects.select_related('author', 'group').all()
    return render(request, template, {'page_list': page_list})
Пример простой функции
template - Переменная для хранения пути к шаблону страницы отображения
post_list - Список постов, которые берутся из базы данных
render(request, template, {'page_list': page_list}) - возвращает экземпляр объекта с параметрами шаблона и контекста
Пример, функции выполняющую несколько задач
def post_edit(request, post_id):
    template = 'posts/create_post.html'
    post = get_object_or_404(Post, id=post_id)
    if post.author != request.user:
        return redirect('posts:post_detail', post_id=post.id)
    if request.method == 'POST':
        form = PostForm(request.POST or None,
                        files=request.FILES or None,
                        instance=post)
        if form.is_valid():
            post = form.save()
            return redirect('posts:post_detail', post_id=post.id)
    form = PostForm(request.POST or None,
                    files=request.FILES or None,
                    instance=post)
    context = {
        'post': post,
        'form': form,
        'is_edit': True,
    }
    return render(request, template, context)
Пример сложной функции
Функция включает проверки:
- является ли пользователь автором поста.
- клиентский запрос является 'POST'
- правильность заполнения формы
Контроллеры - классы
Разработка и описание контроллеров Django
Контроллер-класс может самостоятельно выполнять заложенные простые действия.

Расширенные действия добавляются при помощи примесей (специальные классы mixin), от которых класс наследуется.

Контроллеры-классы объявлены в модуле django.views.generic

Контроллеры-классы позволяют:

  • Организация кода, относящегося к конкретным методам HTTP ( GET, POST, и т. д.), может решаться отдельными методами вместо условного ветвления.
  • Объектно-ориентированные методы, такие как примеси (множественное наследование), могут использоваться для разложения кода на повторно используемые компоненты.
Задать параметры контроллера-класса можно создав класс и наследоваться от нужного контроллера.
В представлении на основе классов функция будет выглядеть так
from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):
        # <view logic>
        return HttpResponse('result')
Использование миксинов
Миксины — это форма множественного наследования, при которой можно комбинировать поведение и атрибуты нескольких родительских классов. Миксины отличный способ повторного использования кода в нескольких классах.



Можно наследоваться только от одного общего представления, а остальные должны быть миксинами.

Документация по ссылке