【问题标题】:Django Rest Framework API sets image to default image even if user uploads an image即使用户上传图像,Django Rest Framework API 也会将图像设置为默认图像
【发布时间】:2021-12-01 05:10:26
【问题描述】:

当我尝试通过 DRF 创建新用户时,即使用户上传了图像,头像字段也会显示默认图像。当我尝试通过管理面板创建带有图像的用户时,它工作正常。所以我假设我在序列化程序中遗漏了一些东西。

自定义用户模型

class myAccountManager(BaseUserManager):
    def create_user(self, email, username, password=None):
        if not email:
            raise ValueError('Users must have an email')
        
        if not username:
            raise ValueError('Users must have an username')
        
        user = self.model(
            email = self.normalize_email(email),
            username=username,
        )

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

    def create_superuser(self, email, username, password):
        user = self.create_user(
            email = self.normalize_email(email),
            password=password,
            username=username,
        )
        user.is_admin=True
        user.is_staff=True
        user.is_superuser=True
        user.save(using=self._db)
        return user

class User(AbstractBaseUser):
    email = models.EmailField(verbose_name="email", max_length=60, unique=True)
    username = models.CharField(max_length=30, unique=True)
    avatar = models.ImageField(default='default.jpg')
    date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now_add=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    objects = myAccountManager()

    def __str__(self):
        return self.username
    
    def has_perm(self, perm, obj=None):
        return self.is_admin
    
    def has_module_perms(self, app_label):
        return True

用户序列化器

UserModel = User


class UserSerializer(serializers.ModelSerializer):

    password = serializers.CharField(write_only=True)

    def create(self, validated_data):

        user = UserModel.objects.create_user(
            username=validated_data['username'],
            password=validated_data['password'],
            email=validated_data['email'],
        )

        return user

    class Meta:
        model = UserModel
        # Tuple of serialized model fields (see link [2])
        fields = ( "id", "email", "username", "password", "avatar")

静态文件路径

STATIC_URL = '/static/'
MEDIA_URL = '/images/'

STATICFILES_DIRS = [
    BASE_DIR / 'static'
]

MEDIA_ROOT = BASE_DIR /'static/images'

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    问题在于序列化程序的 create() 方法。您没有将 avatar 数据传递给 create_user(...) 方法。所以,更新你的方法如下,

    
    from rest_framework import serializers
    
    UserModel = User
    
    
    class UserSerializer(serializers.ModelSerializer):
        password = serializers.CharField(write_only=True)
    
        def create(self, validated_data):
            return UserModel.objects.create_user(**validated_data)
    
        class Meta:
            model = UserModel
            # Tuple of serialized model fields (see link [2])
            fields = ("id", "email", "username", "password", "avatar")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2020-09-23
      • 1970-01-01
      • 2020-03-10
      相关资源
      最近更新 更多