2016-07-18 115 views
6

Desidero creare un'API in cui l'utente possa aggiornare il proprio profilo. Nel mio caso, un utente può aggiornare il suo nome utente e la sua password. Per cambiare il suo/il suo profilo, un link API dovrebbe essere /api/change/usernameOfThatUser. Quando utilizzo un nome utente non esistente nel collegamento, ottengo ancora la pagina API UserProfileChange e le caselle di input non sono piene di dati precedenti. Come posso risolvere questo?aggiornamento profilo utente utilizzando django rest framework 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

Cosa vuoi che accada quando usi il nome utente non esistente nel link? –

+0

La tua domanda non ha senso. "Come posso risolvere questo?" << devi dirci quale comportamento è previsto qui perché quello che hai è quello che mi aspetterei. – Linovia

+0

supponiamo che il mio nome utente sia michael, quindi quello che voglio è se voglio cambiare il mio nome utente, quindi farei/api/users/michael e la pagina verrà mostrata con campo nome utente e campo password. Nel campo del nome utente, il mio nome sarà già compilato, quindi lo modificherò e lo salverò. – pri

risposta

7

Forse provare a fare somethi ng come questo invece nella tua 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) 

Ciò fornirà tutti i dati esistenti per l'utente in base al nome utente inserito nell'URL. Se il nome utente non esiste, genererà un errore 404. È inoltre possibile aggiornare o eliminare l'oggetto.

+0

La password viene mostrata nel modulo sha256 $ 24000 $. Come posso mostrare la casella vuota solo per la password? Qualsiasi utente autenticato può aprire la pagina di modifica del profilo di un altro utente. Quindi mi puoi illuminare il concetto per risolvere questo? – pri

+0

@pri Se date un'occhiata al codice ora, si assicurerà che l'utente possa solo modificare il proprio profilo. E 'stato un cambio di permesso. Vorrei creare una funzione separata per la funzionalità di modifica della password. Hai bisogno di aiuto anche con quello? – jape

+0

@pri Puoi dare un'occhiata a questo hashing della password: http://stackoverflow.com/questions/27586095/why-isnt-my-django-user-models-password-hashed – jape