无法使用自定义用户模型Django Rest Framework登录

问题描述 投票:0回答:1

[我刚刚为Django Rest Framework使用Django创建了Custom User Model,我创建generics.ListAPIView以获取用户列表并创建新用户然后,使用views.APIView创建带有覆盖的post()和验证的登录视图。但是,当我单击"POST"时,它返回了"User already exists"。为什么即使我使用django-rest-auth,登录方法也尝试创建帐户?

提前感谢

这里是代码

models.py

class AccountManager(BaseUserManager):
    def create_user(self, email, first_name=None, last_name=None, password=None, is_active=True, is_staff=False, is_admin=False, is_superuser=False):
        if not email:
            raise ValueError("User must have an email address")
        if not password:
            raise ValueError("User must have a password")
        if not first_name:
            raise ValueError("User must have a first name")
        user = self.model(
                email=self.normalize_email(email)
            )
        user.set_password(password)
        user.first_name = first_name
        user.last_name = last_name
        user.staff = is_staff
        user.admin = is_admin
        user.active = is_active
        user.superuser = is_superuser
        user.save(using=self._db)
        return user

    def create_superuser(self, email, first_name=None, last_name=None, password=None):
        user = self.create_user(
                email=email,
                first_name = first_name,
                last_name = last_name,
                password=password,
                is_superuser=True,
                is_staff=True,
                is_admin=True,

            )
        return user

class Account(AbstractBaseUser):
    email       =models.EmailField(max_length=255, unique=True)
    first_name  = models.CharField(max_length=255,default='')
    last_name   = models.CharField(max_length=255, default='')
    active      = models.BooleanField(default=True)
    staff       = models.BooleanField(default=False)
    admin       = models.BooleanField(default=False)
    superuser   = models.BooleanField(default=False)
    created_data = models.DateTimeField(auto_now_add=True)
    last_login = models.DateTimeField(auto_now=True)

    #USERNAME_FIELD and password are required by default
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

    objects = AccountManager()

    def __str__(self):
        return self.email

    def get_full_name(self):
        return (self.first_name + self.last_name)

    def get_short_name(self):
        return self.first_name

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_superuser(self):
        return self.superuser

serializers.py

class AccountRegistrationSerializer(serializers.ModelSerializer):
    # password = serializers.CharField(style={'input_type':'password'}, write_only=True)
    password2 = serializers.CharField(style={'input_type':'password'}, write_only=True)
    class Meta:
        model = Account
        extra_kwargs = {
                    'password': {'write_only': True}
        }
        fields = ['email', 'first_name', 'last_name','password', 'password2',]

    def create(self, validated_data):
        account = Account(
            email=self.validated_data['email'],
            first_name=self.validated_data['first_name'],
            last_name=self.validated_data['last_name']
            )
        password = self.validated_data['password']
        password2 = self.validated_data['password2']

        if password != password2:
            raise serializer.ValidationError({'password':'Passwords must match'})
        account.set_password(password)
        account.save()
        return account

class AccountLoginSerializer(serializers.ModelSerializer):

    class Meta:
        model = Account
        extra_kwargs = {
            'password': {
                'write_only': True
            },
            'first_name': {
                'read_only': True
            },
            'last_name': {
                'read_only': True
            },

        }
        fields = ['email', 'first_name', 'last_name', 'password']

    def validate(self, data):
        return data

views.py

class AccountLoginView(APIView):
    permission_classes = [AllowAny,]
    serializer_class = AccountLoginSerializer
    def post(self, request, *args, **kwargs):
        data = request.data
        serializer = AccountLoginSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            new_data = serializer.data
            return Response(new_data, status=HTTP_200_OK)
        return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
django-rest-framework django-rest-auth
1个回答
0
投票
距我问这个问题已经5天了。我已经通过重写to_internal_value方法解决了这个问题,并验证了序列化程序。

serializer.py

© www.soinside.com 2019 - 2024. All rights reserved.