2016-07-18 43 views
6

我想创建一个API,用户可以在其中更新他们的配置文件。在我的情况下,用户可以更新他/她的用户名和密码。要更改他/她的个人资料,API链接应为/api/change/usernameOfThatUser。当我在链接中使用不存在的用户名时,我仍然得到userProfileChange API页面,并且输入框未填充以前的数据。我该如何解决这个问题?使用Django rest框架API更新用户配置文件

serializers.py

User = get_user_model() 

class UserProfileChangeSerializer(ModelSerializer): 
    username = CharField(required=False, allow_blank=True, initial="current username") 
    class Meta: 
     model = User 
     fields = [ 
      'username', 
      'password', 
     ] 

    def update(self, instance, validated_data): 
     instance.username = validated_data.get('username',instance.username) 
     print('instance of username',instance.username) 
     return instance 

views.py

class UserProfileChangeAPIView(UpdateAPIView): 
    serializer_class = UserProfileChangeSerializer 
    lookup_field = 'username' 

urls.py

url(r'^change/(?P<username>[\w-]+)$', UserProfileChangeAPIView.as_view(), name='changeProfile'), 
+0

你想在链接中使用不存在的用户名时发生什么? –

+0

你的问题没有意义。 “我该如何解决这个问题?” “你需要告诉我们这里有什么行为,因为你拥有的是我期望的。 – Linovia

+0

假设我的用户名是michael,那么我想要的是如果我想更改我的用户名,那么我会做/ api/users/michael,页面将显示用户名字段和密码字段。在用户名字段中,我的名字已经填入,然后编辑并保存。 – pri

回答

7

也许尝试做somethi ng像这样,而不是在你的views.py

from rest_framework import generics, mixins, permissions 

User = get_user_model() 

class UserIsOwnerOrReadOnly(permissions.BasePermission): 
    def has_object_permission(self, request, view, obj): 
     if request.method in permissions.SAFE_METHODS: 
      return True 
     return obj.id == request.user.id 

class UserProfileChangeAPIView(generics.RetrieveAPIView, 
           mixins.DestroyModelMixin, 
           mixins.UpdateModelMixin): 
    permission_classes = (
     permissions.IsAuthenticated, 
     UserIsOwnerOrReadOnly, 
    ) 
    serializer_class = UserProfileChangeSerializer 
    parser_classes = (MultiPartParser, FormParser,) 

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

    def delete(self, request, *args, **kwargs): 
     return self.destroy(request, *args, **kwargs) 

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

这会给你所有的现有数据进行基于URL传递的用户名的用户。如果用户名不存在,则会引发404错误。您也可以更新或删除该对象。

+0

密码显示在sha256 $ 24000 $表单中。我怎样才能显示空箱只用于密码?任何经过认证的用户都可以打开其他用户的配置文件编辑页面。那么你能否启发我解决这个问题的概念? – pri

+0

@pri如果您现在查看代码,它将确保用户只能编辑他们自己的配置文件。这是一个许可改变。我会为密码更改功能创建一个单独的函数。你还需要帮助吗? – jape

+0

@pri你可以看看这个哈希密码:http://stackoverflow.com/questions/27586095/why-isnt-my-django-user-models-password-hashed – jape