TypeError: User() получил неожиданные аргументы ключевого слова: 'password2' : Django JWT Authentication

Я пытаюсь создать приложение для аутентификации пользователей с использованием JWT-токена django, когда я пытаюсь протестировать свой api для аутентификации пользователей и проверить password и password2, он выдает следующую ошибку:

TypeError: User() got unexpected keyword arguments: 'password2'

Моя serializers.py следующая:

from rest_framework import serializers
from account.models import User

class UserRegistrationSerializers(serializers.ModelSerializer):
    password2=serializers.CharField(style={'input_type':'password'}, write_only=True)
    class Meta:
        model = User
        fields=['email','name','tc','password','password2']
        extra_kwargs={
            'password':{'write_only':True}
        }

def validate(self, attrs):
    password=attrs.get('password')
    password2=attrs.get('password2')
    if password != password2:
        raise serializer.ValidationError("Password and Confirm Password Does not match")
    return attrs

def validate_data(self, validate_data):
    return User.objects.create_user(**validate_data)

а моя views.py следующая:

from django.shortcuts import render
from rest_framework.response import Response
from rest_framework import status
from rest_framework.views import APIView
from account.serializers import UserRegistrationSerializers


# Create your views here.
class UserRegistrationView(APIView):
    def post(self, request, format=None):
        serializer=  UserRegistrationSerializers(data=request.data)
        if serializer.is_valid(raise_exception=True):
            user= serializer.save()
            return Response({'msg':'Registration Successful'}, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

мой models.py файл выглядит следующим образом:

from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
# Create your models here.

class UserManager(BaseUserManager):
    def create_user(self, email, name, tc, password=None, password2=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
            name=name,
            tc=tc,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, name, tc, password=None):
        """
        Creates and saves a superuser with the given email, date of
        birth and password.
        """
        user = self.create_user(
            email,
            password=password,
            name=name,
            tc=tc,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user
class User(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='Email',
        max_length=255,
        unique=True,
    )
    #date_of_birth = models.DateField()
    name= models.CharField(max_length=200)
    tc=models.BooleanField()
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name','tc']

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return self.is_admin

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

Полный traceback выглядит следующим образом:

Traceback (последний последний вызов): Файл "D:\jwt\lib\site-packages\django\core\handlers\exception.py", строка 55, in inner
response = get_response(request) File "D:\jwt\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "D:\jwt\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view return view_func(*args, **kwargs) File "D:\jwt\lib\site-packages\django\views\generic\base.py", line 103, in view
return self.dispatch(request, *args, **kwargs) File "D:\jwt\lib\site-packages\rest_framework\views.py", line 509, in dispatch response = self.handle_exception(exc) File "D:\jwt\lib\site-packages\rest_framework\views.py", line 469, in обработать_исключение self.raise_uncaught_exception(exc) Файл "D:\jwt\lib\site-packages\rest_framework\views.py", строка 480, in raise_uncaught_exception raise exc Файл "D:\jwt\lib\site-packages\rest_framework\views.py", строка 506, in dispatch response = handler(request, *args, **kwargs) File "D:\djangoauthapi1\account\views.py", line 13, in post user= serializer.save() Файл "D:\jwt\lib\site-packages\rest_framework\serializers.py", строка 212, in save
self.instance = self.create(validated_data) File "D:\jwt\lib\site-packages\rest_framework\serializers.py", line 981, in create
raise TypeError(msg) TypeError: Получена ошибка TypeError при вызове User.objects.create(). Это может быть связано с тем, что у вас есть записываемое поле в классе сериализатора, которое не является допустимым аргументом для User.objects.create(). Возможно, вам нужно сделать поле доступным только для чтения или переопределить метод UserRegistrationSerializers.create(), чтобы правильно обработать это поле. это правильно. Оригинальное исключение: Traceback (most recent call last): Файл "D:\jwt\lib\site-packages\rest_framework\serializers.py", строка 962, in create
instance = ModelClass._default_manager.create(**validated_data) Файл "D:\jwt\lib\site-packages\django\db\models\manager.py", строка 85, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) Файл "D:\jwt\lib\site-packages\django\db\models\query.py", строка 669, in create obj = self.model(**kwargs) Файл "D:\jwt\lib\site-packages\django\db\models\base.py", строка 565, in init
raise TypeError( TypeError: User() получил неожиданные аргументы ключевого слова: 'password2'

я разобрался с каждой строчкой кода, но не могу уловить, в чем именно заключается ошибка, пожалуйста, нужна помощь.

Потому что ваш сериализатор имеет password2, а модель пользователя не имеет.

Просто вставьте пароль2 в validated_data

from rest_framework import serializers
from account.models import User

class UserRegistrationSerializers(serializers.ModelSerializer):
    password2=serializers.CharField(style={'input_type':'password'}, write_only=True)
    class Meta:
        model = User
        fields=['email','name','tc','password','password2']
        extra_kwargs={
            'password':{'write_only':True}
        }

def validate(self, attrs):
    password=attrs.get('password')
    password2=attrs.pop('password2')
    if password != password2:
        raise serializer.ValidationError("Password and Confirm Password Does not match")
    return attrs

def create(self, validate_data):
    return User.objects.create_user(**validate_data)

В файле serializers.py ваши validate и validate_data должны быть внутри класса UserRegistrationSerializers и должны быть вне класса Meta, все остальное верно.Пример:

class UserRegistrationSerializer(serializers.ModelSerializer):

  password2 = serializers.CharField(style={'input_type':'password'}, write_only=True)
  class Meta:
    model = User
    fields=['email', 'name', 'password', 'password2', 'tc']
    extra_kwargs={
      'password':{'write_only':True}
    }


  def validate(self, attrs):
    password = attrs.get('password')
    password2 = attrs.get('password2')
    if password != password2:
      raise serializers.ValidationError("Password and Confirm Password doesn't match")
    return attrs

  def validate_data(self, validate_data):
    return User.objects.create_user(**validate_data)
Вернуться на верх