Добавление дополнительных действий к наборам представлений

Можно добавить дополнительные действия в наборы представлений. Давайте добавим дополнительные действия в представление CourseEnrollView. Отредактируйте файл api/views.py и измените класс CourseViewSet, следующим образом:

from rest_framework.decorators import detail_route


class CourseViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer

    @detail_route(methods=['post'],
                  authentication_classes=[BasicAuthentication],
                  permission_classes=[IsAuthenticated])
    def enroll(self, request, *args, **kwargs):
        course = self.get_object()
        course.students.add(request.user)
        return Response({'enrolled': True})

Мы добавляем пользовательский метод enroll(), который представляет дополнительное действие для этого набора представлений. Давайте разберем новые дествия ближе:

  • Мы используем декоратор detail_route, чтобы указать, что это действие, которое необходимо выполнить для одного объекта.
  • Декоратор позволяет добавлять настраиваемые атрибуты для действия. Мы указываем, что для этого представления разрешен только метод POST, и задаем классы аутентификации и разрешений.
  • Мы используем self.get_object() для извлечения объекта Course.
  • Мы добавляем текущему пользователю связь «многие ко многим» и возвращаем пользовательский отклик на успех.

Отредактируйте api/urls.py и удалите следующий URL-адрес, поскольку он больше не нужен.

url(r'^courses/(?P<pk>\d+)/enroll/$', views.CourseEnrollView.as_view(), name='course_enroll'),

Затем отредактируйте api/views.py и удалите класс CourseEnrollView.

URL-адрес для регистрации в курсах теперь автоматически генерируется маршрутизатором. URL-адрес остается неизменным, поскольку он построен динамически с использованием имени enroll.

results matching ""

    No results matching ""