自定义用户管理器:仅填充必填字段

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

我切换到自定义用户管理器,以使用电子邮件作为用户名。自从进行了更改之后,除了电子邮件和密码外,所有字段都不会在注册时填充,例如,创建了一个用户,但没有first_name,last_name等。我印象深刻的是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)
    })
django django-rest-framework
1个回答
0
投票
named参数而不是

positional参数填充这些参数:

user = User.objects.create_user( first_name=validated_data['first_name'], last_name=validated_data['last_name'], email=validated_data['email'], password=validated_data['password'], startTime=validated_data['startTime'], groups=validated_data['groups'], is_staff=is_staff )或通过字典解包:
user = User.objects.create_user(
    **validated_data,
    is_staff=is_staff
)
© www.soinside.com 2019 - 2024. All rights reserved.