2015-04-25 5 views
7

Chcę się upewnić, że request.user może wystawić tylko żądanie POST, aby utworzyć temat forum, w którym jest auther. Z PUT i DELETE mogę to osiągnąć za pomocą has_object_permission, ale z POST nie jestem w stanie tego zrobić, zgaduję, ponieważ obiekt nie został jeszcze utworzony.Django Rest obiektowe uprawnienia na poziomie obiektu 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 

W jaki sposób podjąłbym się weryfikacji request.user == obj.author w zapytaniach POST?

+1

Masz 'author' polu na swojej serializatora, które starają się zapewnić, jest ustawiony do bieżącego użytkownika podczas cresting obiekt? Są lepsze sposoby na to, niż poprzez sprawdzenie uprawnień. –

+0

tak, nie o to chodzi. Działa dobrze dla PUT i DELETE, ale z POST has_object_permission nie działa. – awwester

+1

Przez "nie działa" masz na myśli "nie nazywa się", "powoduje błąd" lub "nigdy nie przechodzi"? Nie jest jasne, co próbujesz zrobić w swoim pytaniu i [pachnie jak problem XY] (http://meta.stackexchange.com/q/66377/159034). –

Odpowiedz

3

skończyło się robi walidacji w viewset zamiast serializatora:

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)