Пользовательский менеджер пользователей: заполняются только обязательные поля - PullRequest
1 голос
/ 30 мая 2020

Я переключился на настраиваемый менеджер пользователей, чтобы использовать электронную почту в качестве имени пользователя. После внесения этого изменения все поля, кроме адреса электронной почты и пароля, не заполняются при регистрации, например, пользователь создается, но не имеет имени first_name, last_name и т.д. c. У меня создалось впечатление, что классы django можно переопределить на основе поля на поле без нарушения других полей. Разве это не так?

Менеджер:

class CustomUserManager(BaseUserManager):
    """
    Custom user model manager where email is the unique identifiers
    for authentication instead of usernames.
    """
def create_user(self, email, password, **extra_fields):
    """
    Create and save a User with the given email and password.
    """
    if not email:
        raise ValueError(_('The Email must be set'))
    email = self.normalize_email(email)
    user = self.model(email=email, **extra_fields)
    user.set_password(password)
    user.save()
    return user

def create_superuser(self, email, password, **extra_fields):
    """
    Create and save a SuperUser with the given email and password.
    """
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_superuser', True)
    extra_fields.setdefault('is_active', True)

    if extra_fields.get('is_staff') is not True:
        raise ValueError(_('Superuser must have is_staff=True.'))
    if extra_fields.get('is_superuser') is not True:
        raise ValueError(_('Superuser must have is_superuser=True.'))
    return self.create_user(email, password, **extra_fields)

Сериализатор:

class RegisterSerializer(serializers.ModelSerializer):

class Meta:
    User = get_user_model()
    model = User
    fields = ('first_name', 'last_name', 'email', 'password', 'startTime', 'groups')
    extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        request = self.context["request"]
        if (request.data.get("groups", None) == 1):
            is_staff = True
        else:
            is_staff = False
        user = User.objects.create_user(validated_data['first_name'],
                                        validated_data['last_name'],
                                        validated_data['email'],
                                        validated_data['password'],
                                        validated_data['startTime'],
                                        validated_data['groups'],
                                        validated_data['is_staff'])
        return user

Модель:

class CustomUser(AbstractUser):
username = None
email = models.EmailField(_('email address'), unique=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []

startTime = models.TimeField(null=True)
# add additional fields in here
objects = CustomUserManager()
def __str__(self):
    return self.email

Просмотр:

class RegisterAPI(generics.GenericAPIView):
  permission_classes = [
    permissions.IsAdminUser
  ]
  serializer_class = RegisterSerializer

  def post(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = serializer.save()
    return Response({
      "user": UsersSerializer(user, context=self.get_serializer_context()).data,
      #"token": AuthToken.objects.create(user)
    })

1 Ответ

1 голос
/ 30 мая 2020

Вам необходимо заполнить их через именованные параметры, а не позиционные параметры:

user = User.objects.create_user(
    <b>first_name=</b>validated_data['first_name'],
    <b>last_name=</b>validated_data['last_name'],
    <b>email=</b>validated_data['email'],
    <b>password=</b>validated_data['password'],
    <b>startTime=</b>validated_data['startTime'],
    <b>groups=</b>validated_data['groups'],
    <b>is_staff=</b>is_staff
)

или через распаковку словаря:

user = User.objects.create_user(
    <b>**validated_data</b>,
    <b>is_staff=</b>is_staff
)
...