2016-07-18 9 views
6

Ich möchte eine API erstellen, wo Benutzer ihr Profil aktualisieren können. In meinem Fall kann ein Benutzer seinen Benutzernamen und sein Passwort aktualisieren. Um sein/ihr Profil zu ändern, sollte ein API-Link /api/change/usernameOfThatUser sein. Wenn ich einen nicht vorhandenen Benutzernamen in der Verknüpfung verwende, erhalte ich immer noch die API-Seite userProfileChange, und die Eingabefelder sind nicht mit vorherigen Daten gefüllt. Wie kann ich das lösen?Aktualisierung Benutzerprofil mit 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

Was möchten Sie tun, wenn Sie einen nicht vorhandenen Benutzernamen im Link verwenden? –

+0

Ihre Frage ergibt keinen Sinn. "Wie kann ich das lösen?" << Sie müssen uns sagen, welches Verhalten hier erwartet wird, weil das, was Sie haben, das ist, was ich erwarte. – Linovia

+0

Angenommen, mein Benutzername ist Michael dann was ich will ist, wenn ich meinen Benutzernamen ändern möchte, dann würde ich tun/api/users/michael und die Seite wird mit Benutzername Feld und Passwort Feld angezeigt werden. Im Benutzernamenfeld ist mein Name bereits ausgefüllt, ich würde ihn dann bearbeiten und speichern. – pri

Antwort

7

Vielleicht versuchen somethi tun ng so in Ihrem 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) 

Dies wird Ihnen alle vorhandenen Daten für die auf den Benutzernamen in der URL übergeben basierten Benutzer geben. Wenn der Benutzername nicht existiert, wird ein 404-Fehler ausgelöst. Sie können das Objekt auch aktualisieren oder löschen.

+0

Das Passwort wird in sha256 $ 24000 $ form angezeigt. Wie kann ich leere Box nur für Passwort anzeigen? Jeder authentifizierte Benutzer kann die Profilbearbeitungsseite eines anderen Benutzers öffnen. Kannst du mir das Konzept erklären, um das zu lösen? – pri

+0

@pri Wenn Sie sich den Code jetzt ansehen, wird sichergestellt, dass der Benutzer nur sein eigenes Profil bearbeiten kann. Es war eine Erlaubnisänderung. Ich würde eine getrennte Funktion für die Kennwortänderungsfunktionalität erstellen. Brauchen Sie auch Hilfe? – jape

+0

@pri Sie können sich dies für das Hashing des Passworts ansehen: http://stackoverflow.com/questions/27586095/why-isnt-my-django-user-models-password-hashed – jape