使用用户端点设置密码

时间:2019-03-03 18:38:32

标签: python django python-3.x django-models django-rest-framework

我是python的新手,正在尝试为创建的用户设置/更新密码。

我想要实现的是:

  1. 为创建的用户设置密码
  2. 为创建的用户更新密码

在创建用户或查看使用详细信息时,我不希望密码字段可用。代码如下。

serializers.py

from rest_framework import serializers
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password


class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'id', 'username', 'email', 'first_name', 'last_name')


class PasswordSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = 'password'

and views.py是

from urllib import request
from rest_framework import viewsets, status
from django.contrib.auth.models import User
from atest.serializers import UserSerializer,PasswordSerializer
from rest_framework import permissions
from atest.permissions import IsOwnerOrReadOnly
from rest_framework.decorators import action
from rest_framework.response import Response


class UserViewSet(viewsets.ModelViewSet):
    """
    This viewset provides operations on Users table to the same user.
    """

    # permission_classes = (permissions.IsAuthenticatedOrReadOnly,
    #                       IsOwnerOrReadOnly,)
    queryset = User.objects.all()
    serializer_class = UserSerializer

    @action(detail=True, methods=['post', 'put'])
    def set_password(self, request, pk=None):
        user = self.get_object()
        serializer = PasswordSerializer(data=request.data)
        if serializer.is_valid():
            user.set_password(serializer.data['password'])
            user.save()
            return Response({'status': 'password set'})
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

请帮助我如何实现我想要的。

1 个答案:

答案 0 :(得分:0)

在您的课堂上。

class UserSerializer(serializers.HyperlinkedModelSerializer):

    # Add password field this allows for the characters to be hidden.

    password = serializers.CharField(max_length=128,
     style={'input_type':'password'})

    Meta:
         model = User
         fields = ('url', 'id', 'username', 'email', 'first_name', 'last_name', 'password') #Add password to your fields

要更新用户,您必须覆盖功能update

def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.content = validated_data.get('content', instance.content)
        instance.created = validated_data.get('created', instance.created)
        instance.save()
        return instance