Джанго. '' Аргумент `actions` должен быть предоставлен при вызове` .as_view () `'', когда я пытаюсь разрешить DELETE, PUT, ETC - PullRequest
0 голосов
/ 15 мая 2019

Я должен разрешить удаление и обновление запросов с фронта для моих объектов какой-либо модели. Я хочу удалить экземпляр и соответствующую строку в БД.

Я пытался использовать информацию из учебных пособий по DRF (https://www.django -rest-framework.org / tutorial / 6-viewsets-and-routers / ), некоторые другие примеры. Я понимаю, что если я использую ViewSet, мне нужно разрешить некоторые действия и использовать строки. Я использую декоратор как в учебнике по DRF.

Вот мой view.py

class DualFcaPlanUseViewSet(viewsets.ModelViewSet):

    authentication_classes = (CsrfExemptSessionAuthentication,)
    def get_queryset(self): 
        user = self.request.user
        return FcaPlanUse.objects.filter(id_fca__num_of_agree__renters_id__user_key = user)
    def get_serializer_class(self):
        if self.request.method == 'GET':
            return FcaPlanUseSerializer
        if self.request.method == 'POST':
            return FcaPlanUsePOSTSerializer
    @action(detail=True, renderer_classes=[renderers.StaticHTMLRenderer]) 
    def highlight(self, request, *args, **kwargs):
        fcaplanuse = self.get_object()
        return Response(fcaplanuse.highlighted)
    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

мои действия в приложении urls.py

from django.conf.urls import url
from rest_framework import renderers
from . import views
from cutarea.views import DualFcaPlanUseViewSet

fcaplanuse_list = DualFcaPlanUseViewSet.as_view({
    'get': 'list',
    'post': 'create'
})
fcaplanuse_detail = DualFcaPlanUseViewSet.as_view({
    'get': 'retrieve',
    'put': 'update',
    'patch': 'partial_update',
    'delete': 'destroy'
})
fcaplanuse_highlight = DualFcaPlanUseViewSet.as_view({
    'get': 'highlight'
}, renderer_classes=[renderers.StaticHTMLRenderer])

так что часть моего проекта urls.py

from cutarea.views import *
#...
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'cutarea', DualFcaPlanUseViewSet.as_view(), base_name='cutareadel')
#...

urlpatterns = [
    #...
    url(r'^api/', include(router.urls)),
]

Итак, результат: TypeError: The `actions` argument must be provided when calling `.as_view()` on a ViewSet. For example `.as_view({'get': 'list'})

Если я установлю какое-то действие, как в примере было выдано терминалом: router.register(r'cutarea', DualFcaPlanUseViewSet.as_view('destroy': 'delete'), base_name='cutareadel') Я столкнулся с синтаксической ошибкой ... Я хочу понять, как viewset работает с маршрутизаторами, и как можно разрешить дополнительные методы HTTP (удаление, обновление и т. Д.)

UPD если использовать это

router.register(r'cutarea', DualFcaPlanUseViewSet, base_name='cutareadel')``` The error is solved. But DELETE method not allowed. What is wrong?

1 Ответ

3 голосов
/ 15 мая 2019

Вы не используете as_view при регистрации ViewSet:

from cutarea.views import *
#...
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'cutarea', DualFcaPlanUseViewSet, base_name='cutareadel')
#...

urlpatterns = [
    #...
    url(r'^api/', include(router.urls)),
]
...