0

Ich habe versucht, eine einzige ManuscriptItem Instanz mit Postman löschen, um meine API-Anfragen auf gegen die unten Ansicht ausführen:Delete-Methode auf Django Rastrahmen ModelViewSet

class ManuscriptViewSet(viewsets.ModelViewSet): 
    """Handles creating, reading and updating items.""" 

    authentication_classes = (TokenAuthentication,) 
    serializer_class = serializers.ManuscriptItemSerializer 
    permission_classes = (permissions.PostOwnManuscript, IsAuthenticated,) 

    def perform_create(self, serializer): 
     """Sets the user profile to the logged in user.""" 
     serializer.save(author=self.request.user) 

    def get_queryset(self): 
     """ 
     This view should return a list of all the manuscripts 
     for the currently authenticated user. 
     """ 
     user = self.request.user 
     return models.ManuscriptItem.objects.filter(author=user) 

    def destroy(self, request, *args, **kwargs): 
     instance = self.get_object() 
     self.perform_destroy(instance) 
     return Response(status=status.HTTP_204_NO_CONTENT) 

    def perform_destroy(self, instance): 
     instance.delete() 

Die zerstören und führen zerstören Funktionen sind, was ich versucht habe ohne Erfolg. Dies ist, was es gibt, wenn ich versucht:

{ "detail": "Method \"DELETE\" not allowed." }

Dies ist, wie meine URLs momentan registriert sind:

router = DefaultRouter() 
router.register('manuscripts', views.ManuscriptViewSet, base_name="manuscripts") # auto basename for models 
router.register('manuscriptlibrary', views.ManuscriptLibraryViewSet, base_name="manuscript_library") 
router.register('manuscriptsettings', views.ManuscriptSettingsViewSet) 


urlpatterns = [ 
    url(r'', include(router.urls)) 
] 

Ich bin ich die ModelViewSet modifizieren falsch machen brauche ich einen anderen Ansatz zu verwenden, da die Art von ModelViewSet? Ich habe erwartet, dass es auf Postman funktioniert, wenn ich einen Authorized Benutzer verwendet habe, um eine ManuscriptItem-Instanz zu löschen. In den Dokumenten wurde angegeben, dass die Destroy() -Methode verwendet werden kann.

Zusätzliche Informationen

Die URL wird verwendet:

http://localhost:8000/manuscripts-api/manuscripts/

Die Modellinstanz aus gelöscht werden:

class ManuscriptItem(models.Model): 
    """Represents a single manuscript's content""" 

    author = models.ForeignKey('accounts_api.UserProfile', on_delete=models.CASCADE) 
    title = models.CharField(max_length=255) 
    content = models.CharField(max_length=99999999) 

    def __str__(self): 
     """Django uses when it needs to convert the object to a string""" 
     return str(self.id) 

Die Art, wie ich auf Postbote löschen Anforderungen zu senden versucht haben, mit json:

{ 
    "manuscript": 7, 
} 

Ergebnisse: Methode nicht erlaubt löschen

{ 
    "id": 7, 
    "author": 5, 
    "title": "niceone", 
    "content": "niceone" 
} 

Ergebnisse: Methode löschen

Weitere Fragen/Info nicht erlaubt:

Muss ich den Router-Register nicht mit angeben müssen ein Pk? Ich habe versucht, dies aber nicht funktioniert hat entweder:

router.register('manuscripts/{pk}/$', views.ManuscriptViewSet, base_name="manuscript_detail") 

Postman sagt:

Allow →GET, POST, HEAD, OPTIONS

Antwort

3

Das Problem hier arbeiten, ist, dass Sie DELETE Anfrage an die falsche senden url. Schauen Sie sich die DefaultRouter docs an. Es erzeugt automatisch Ihre URLs in Ihrem viewset:

DefaultRouter class url patterns

Schauen Sie genau auf die DELETE Methode. Es ist auf dem {prefix}/{lookup}/[.format] URL-Muster. Dies bedeutet, dass die entsprechende Router-URL manuscripts/<manuscript_id>/ ist, aber Sie versuchen, DELETE Anfrage nur an manuscripts/ zu senden, was das obige Muster ist. Sie sehen direkt aus der Tabelle, dass die erlaubten HTTP-Methoden nur GET und POST sind. Deshalb erhalten Sie MethodNotAllowed.

Die Lösung für Ihr Problem ist nicht die manuscript_id als JSON Körper des Antrags

{ 
    "manuscript": 7, 
} 

Aber es passieren direkt an die URL weitergeben müssen: Ihre

DELETE http://localhost:8000/manuscripts-api/manuscripts/7/

Und Sie registrieren Viewset wie:

router.register(r'manuscripts', ManuscriptViewSet.as_view(), name='manuscripts') 

wie Sie sehen, DRF generiert die URLs automatisch für Sie.

+0

Ehrfürchtig. Es funktioniert jetzt! Danke für den letzten Schritt! – NewScientists

+0

@NewScientists Gern geschehen! – wencakisa

+0

Ich versuche es, aber ich erhalte diesen Fehler, wenn ich url mit as_view() 'TypeError registrieren: Das \' actions \ 'Argument muss beim Aufruf von \' .as_view() \ 'auf einem ViewSet angegeben werden. Zum Beispiel \ '.as_view ({' get ':' list '}) \ "" Weißt du warum? –

3
def destroy(self, request, *args, **kwargs): 
     try: 
      instance = self.get_object() 
      self.perform_destroy(instance) 
     except Http404: 
      pass 
     return Response(status=status.HTTP_204_NO_CONTENT) 

Verwendung dieses und es

+0

Hallo ich ging mit perform_destroy. Es sagt mir immer noch "Methode \" LÖSCHEN \ "nicht erlaubt." nicht erlaubt, habe ich daher zusätzliche Informationen hinzugefügt. – NewScientists

+0

versuchen Sie die edited ans einmal @NewScientists – Exprator

+0

Vielen Dank jetzt – NewScientists

Verwandte Themen