2017-12-15 6 views
0

나는 사용자 정보를 편집 할 수 있습니다 그것에하는 UserUpdateAPIView이 다음 UserDetailSerializersuperadmin 사용자와 사용자가 API에 액세스하게하려면 어떻게해야합니까?

class UserUpdateAPIView(RetrieveUpdateAPIView): 
    queryset = User.objects.filter(is_admin=False, is_staff=False, is_superuser=False).exclude(status=4) 
    serializer_class = UserDetailSerializer 
    lookup_field = "username" 
    def perform_update(self, serializer): 
     serializer.save() 

:

class UserDetailSerializer(ModelSerializer): 
""" 
user detail 
""" 
class Meta: 
    model = User 
    exclude = [ 
     'password', 
    ] 
    depth = 1 

지금, 모든 사용자가 UserUpdateAPIView에 액세스 할 수 있습니다를, 그것의 나쁜 디자인 때문에. 난 그냥 최고 관리자와 사용자가 APIView에 액세스 할 수, 그것을 구현하는 방법을 원해?

admin 사용자가이 API에 액세스 할 수 있도록 permissions = [IsAdminUser]을 사용할 수 있다는 것을 알고 있지만 최고 관리자와 사용자가 액세스 할 수있게하려는 것입니다.

답변

1
from rest_framework import permissions 
from rest_framework.compat import is_authenticated 

class IsAdminUserOrSelf(permissions.BasePermission): 

    def has_object_permission(self, request, view, obj): 
     # this methid is called in get_object method. 
     # obj mean the object you retrieve.Here you retrieved is User instance. 
     # It's can be any model instance,depend on the Molde you Retrieve in views. 

     # if you want everyone can see user info 
     if request.method in permissions.SAFE_METHODS: 
      return True 
     # if you use Django2.0 is_authenticated(request.user) should be changed to request.user.is_authenticated 
     if request.user and is_authenticated(request.user): 
      # is self or is superuser 
      return obj == request.user or request.user.is_superuser 
     else: 
      return False 

class UserUpdateAPIView(RetrieveUpdateAPIView): 
    permissions = [IsAdminUserOrSelf,] 
    queryset = User.objects.filter(is_admin=False, is_staff=False, is_superuser=False).exclude(status=4) 
    serializer_class = UserDetailSerializer 
    lookup_field = "username" 
    def perform_update(self, serializer): 
     serializer.save() 
+0

'obj'는 무엇을 의미합니까? 로그인 된 사용자라는 뜻입니까? 아니면'obj'가 데이터 (사용자 데이터)라는 것을 의미합니까? – fanhualuojin154873

+0

obj는 검색 한 객체를 의미합니다. get_object 메소드에 의해 반환됩니다. 여기에 User 인스턴스가 있습니다. 모든 모델 인스턴스가 가능하며,보기에서 가져 오는 Molde에 따라 달라집니다. – Ykh

+0

'django-1.11.5'을 사용합니다. is_authenticated를 가져 오는 방법은 무엇입니까? – fanhualuojin154873