Добавление дополнительных действий к наборам представлений
Можно добавить дополнительные действия в наборы представлений. Давайте добавим дополнительные действия в представление 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.