2015-04-25 4 views
7

Ich möchte sicherstellen, dass der request.user nur eine POST-Anfrage erstellen kann, um ein Forum Thema zu erstellen, in dem sie der Autor sind. Mit PUT und DELETE kann ich das erreichen, indem ich die has_object_permission benutze, aber mit POST kann ich das nicht, ich schätze, weil das Objekt noch nicht erstellt wurde.Django Rest Framework-Objekt-Level-Berechtigung für POST

class TopicPermission(IsAuthenticatedOrReadOnly): 
    """ 
    Any user should be able to read topics but only authenticated 
    users should be able to create new topics. An owner or moderator 
    should be able to update a discussion or delete. 
    """ 
    def has_object_permission(self, request, view, obj): 
     if request.method in SAFE_METHODS: 
      return True 

     # Instance must have an attribute named `author` or moderator 
     return obj.author == request.user or request.user.forum_moderator 

Wie würde ich über gehen request.user == obj.author in POST-Anfragen zu überprüfen?

+1

Haben Sie eine 'author' Feld auf dem Serializer, dass Sie, um sicherzustellen, versuchen, den aktuellen Benutzer gesetzt, wenn die cresting Objekt? Dafür gibt es bessere Möglichkeiten als eine Berechtigungsprüfung. –

+0

Ja, darum geht es nicht. Es funktioniert gut für PUT und DELETE, aber mit POST has_object_permission funktioniert nicht. – awwester

+1

Mit "funktioniert nicht" meinst du "wird nicht aufgerufen", "löst einen Fehler aus" oder "geht niemals"? Es ist nicht klar, was Sie in Ihrer Frage zu tun versuchen, und es [riecht wie ein XY-Problem] (http://meta.stackexchange.com/q/66377/159034). –

Antwort

3

ich am Ende tun die Validierung in der Viewset anstelle des Serializer:

class TopicViewSet(viewsets.ModelViewSet): 
    permission_classes = (TopicPermission,) 
    queryset = Topic.objects.all() 
    serializer_class = TopicSerializer 

    def create(self, request, *args, **kwargs): 
     """ 
     verify that the POST has the request user as the obj.author 
     """ 
     if request.data["author"] == str(request.user.id): 
      serializer = self.get_serializer(data=request.data) 
      serializer.is_valid(raise_exception=True) 
      self.perform_create(serializer) 
      headers = self.get_success_headers(serializer.data) 
      return Response(serializer.data, status=201, headers=headers) 
     else: 
      return Response(status=403) 
Verwandte Themen