2016-07-18 10 views
6

Я хочу создать API, в котором пользователь может обновить свой профиль. В моем случае пользователь может обновить свое имя пользователя и пароль. Чтобы изменить свой профиль, ссылка API должна быть /api/change/usernameOfThatUser. Когда я использую несуществующее имя пользователя в ссылке, я по-прежнему получаю страницу API API-интерфейса пользователя, а поля ввода не заполняются предыдущими данными. Как я могу это решить?Обновление профиля пользователя с помощью 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

Что вы хотите, когда используете неиспользуемое имя пользователя в ссылке? –

+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

 Смежные вопросы

  • Нет связанных вопросов^_^