2016-07-18 26 views
6

Kullanıcının profillerini güncelleyebileceği bir API oluşturmak istiyorum. Benim durumumda, bir kullanıcı kullanıcı adını ve şifresini güncelleyebilir. Onun profilini değiştirmek için bir API bağlantısı /api/change/usernameOfThatUser olmalıdır. Bağlantıda mevcut olmayan bir kullanıcı adı kullandığımda, hala userProfileChange API sayfasını alıyorum ve giriş kutuları önceki verilerle doldurulmuyor. Bunu Nasıl Çözebilirim?django rest framework api kullanarak kullanıcı profilini güncelleme

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

Bağlantıda mevcut olmayan kullanıcı adı kullandığınızda ne yapmak istersiniz? –

+0

Sorunuz mantıklı değil. "Bunu Nasıl Çözebilirim?" << Beklediğiniz olanın olması nedeniyle burada hangi davranışın beklendiğini bize söylemelisiniz. – Linovia

+0

Kullanıcı adımın michael olduğunu varsayalım, sonra istediğim kullanıcı adımı değiştirmek istersem o zaman/api/users/michael yapardım ve sayfa kullanıcı adı ve şifre alanı ile gösterilir. Kullanıcı adı alanında, adım zaten doldurulmuş olacak, daha sonra düzenleyip kaydedeceğim. – pri

cevap

7

Belki somethi yapıyor deneyin Bunun yerine 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) 

Bu url geçirilen adınıza dayalı kullanıcı için size mevcut tüm verilerin verecektir. Eğer kullanıcı adı mevcut değilse, 404 hatası artacaktır. Ayrıca nesneyi güncelleyebilir veya silebilirsiniz.

+0

Şifre, sha256 $ 24000 $ formunda gösterilmektedir. Boş kutuyu sadece şifre için nasıl gösterebilirim? Herhangi bir kimliği doğrulanmış kullanıcı, diğer kullanıcının profil düzenleme sayfasını açabilir. Bunu çözmek için bana kavramı aydınlatabilir misin? – pri

+0

@pri Şimdi bir koda bakarsanız, kullanıcının sadece kendi profilini düzenleyebileceğinden emin olur. İzin değişikliği oldu. Parola değiştirme işlevi için ayrı bir işlev oluşturur. Bununla da yardıma ihtiyacın var mı? – jape

+0

@pri Parolayı ele geçirmek için şuna bir göz atabilirsiniz: http://stackoverflow.com/questions/27586095/why-isnt-my-django-user-models-password-hashed – jape

İlgili konular