2017-06-08 297 views
0

我来自越南。django rest框架RetrieveUpdateAPIView

我想通过Django Rest FrameWork更新用户。我可以通过'pk'更新用户。但我无法通过'用户名'更新用户。我希望每个人都帮助我。非常感谢。

serializers.py
class UserDetailSerializer(serializers.ModelSerializer): 
    url_update = serializers.HyperlinkedIdentityField(view_name='api:UserUpdateAPIView', lookup_field='username') 
    class Meta: 
     model = User 
     fields = ('url_update', 'username', 'email', 'user_permissions', 'is_staff', 'groups', 'last_login') 

class UserUpdateSerialier(serializers.ModelSerializer): 
    password = serializers.CharField(
     style={'input_type': 'password'} 
    ) 
    class Meta: 
     model = User 
     fields = ('pk', 'username', 'password') 

    def update(self, instance, validated_data): 
     instance.username = validated_data.get('username', instance.username) 
     instance.set_password(validated_data.get('password', instance.password)) 
     instance.save() 
     return instance 

views.py
class UserDetailAPIView(generics.RetrieveAPIView): 
    permission_classes = (permissions.IsAdminUser,) 
    serializer_class = UserDetailSerializer 
    #queryset = User.objects.all() 
    lookup_field = 'username' 
    def get_object(self): 
     username = self.kwargs["username"] 
     return get_object_or_404(User, username=username) 

class UserUpdateAPIView(generics.RetrieveUpdateAPIView): 
    permission_classes = (permissions.IsAdminUser,) 
    #queryset = User.objects.all() 
    serializer_class = UserUpdateSerialier 

    def get_object(self): 
     username = self.kwargs["username"] 
     return get_object_or_404(User, username=username) 

    def put(self, request, *args, **kwargs): 
     return self.update(request, *args, **kwargs) 

urls.py
url(r'^$', views.UserListAPIView.as_view(), name='UserListAPIView'), 
url(r'^(?P<username>.*)/$', views.UserDetailAPIView.as_view(), name='UserDetailAPIView'), 
url(r'^(?P<username>.*)/update/$', views.UserUpdateAPIView.as_view(), name='UserUpdateAPIView'), 

HTTP 404未找到

允许:GET, HEAD,OPTIONS

内容类型:应用/ JSON

有所不同:接受

{ “细节”: “未找到”。 }

回答

0

您需要设置lookup_field = 'username'UserUpdateAPIView就像你与UserDetailAPIView

+0

我添加lookup_field。但我无法更新用户。 {“detail”:“找不到”。 } – Luan

+0

我明白了。我编辑网址(?P 。*)=>(?P [0-9A-Za-z _ \ - ] +)。我没有添加looks_field。但我编辑网址。我完成了。 – Luan

0

尝试编辑您的看法是这样,

class UserUpdateAPIView(generics.RetrieveUpdateAPIView): 
    permission_classes = (permissions.IsAdminUser,) 
    serializer_class = UserUpdateSerialier 
    lookup_field = 'username' 

    def get_object(self): 
     username = self.kwargs["username"] 
     return get_object_or_404(User, username=username) 

    def put(self, request, *args, **kwargs): 
     return self.update(request, *args, **kwargs) 
+0

我添加了lookup_field。但我无法更新用户。 {“detail”:“找不到”。 } – Luan

+0

我明白了。我编辑网址(?P 。*)=>(?P [0-9A-Za-z _ \ - ] +)。我没有添加looks_field。但我编辑网址。我完成了。 – Luan