2016-07-18 23 views
6

Chcę utworzyć interfejs API, w którym użytkownik może zaktualizować swój profil. W moim przypadku użytkownik może zaktualizować swoją nazwę użytkownika i hasło. Aby zmienić swój profil, link interfejsu API powinien być /api/change/usernameOfThatUser. Kiedy używam nieistniejącej nazwy użytkownika w linku, nadal otrzymuję stronę interfejsu API userProfileChange, a pola wprowadzania nie są wypełnione poprzednimi danymi. Jak mogę to rozwiązać?aktualizowanie profilu użytkownika przy użyciu środowiska 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

Co chcesz zrobić, gdy używasz nieistniejącej nazwy użytkownika w linku? –

+0

Twoje pytanie nie ma sensu. "Jak mogę to rozwiązać?" << musisz nam powiedzieć, jakie zachowanie jest tutaj oczekiwane, ponieważ ten, którego masz, jest tym, którego oczekiwałbym. – Linovia

+0

Załóżmy, że moja nazwa użytkownika to michael to, czego chcę, to jeśli chcę zmienić swoją nazwę użytkownika, to zrobiłbym/api/users/michael, a strona będzie wyświetlana z polem nazwa użytkownika i hasłem. W polu nazwa użytkownika moje imię będzie już wypełnione, a następnie edytuję je i zapiszę. – pri

Odpowiedz

7

Może spróbować zrobić somethi zamiast tego w Twoim 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) 

To da ci wszystkie istniejące dane dla użytkownika na podstawie nazwy użytkownika podanej w adresie URL. Jeśli nazwa użytkownika nie istnieje, spowoduje to błąd 404. Możesz również zaktualizować lub usunąć obiekt.

+0

Hasło jest wyświetlane w formularzu sha256 24000 $. Jak mogę wyświetlić puste pole tylko dla hasła? Każdy uwierzytelniony użytkownik może otworzyć stronę edycji profilu innego użytkownika. Czy możesz mnie oświecić koncepcją rozwiązania tego problemu? – pri

+0

@pri Jeśli teraz spojrzysz na kod, upewnisz się, że użytkownik może edytować tylko swój profil. To była zmiana pozwolenia. Stworzyłbym osobną funkcję do zmiany hasła. Czy potrzebujesz również pomocy? – jape

+0

@pri Możesz rzucić okiem na to hashując: http://stackoverflow.com/questions/27586095/why-isnt-my-django-user-models-password-hashed – jape

Powiązane problemy