Django Rest Framework接口创建用户时上传头像仍保存默认图片问题
问题原因
你的问题出在两处逻辑遗漏,导致上传的avatar字段没有被写入用户创建流程:
- 自定义的用户管理器
myAccountManager的create_user方法没有接收和处理avatar参数 - 序列化器的
create方法调用create_user时,没有将前端上传的avatar值传入
修复步骤
1. 修改自定义用户管理器
调整create_user方法,增加avatar参数的处理逻辑:
class myAccountManager(BaseUserManager): # 新增avatar参数,默认值为None def create_user(self, email, username, password=None, avatar=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, # 赋值avatar,无传入时用默认值 avatar=avatar if avatar else 'default.jpg', ) 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
2. 修改用户序列化器
在调用create_user时传入avatar参数:
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'], # 新增avatar参数传入 avatar=validated_data.get('avatar') ) return user class Meta: model = UserModel fields = ( "id", "email", "username", "password", "avatar")
3. 视图解析器配置(若未配置需补充)
DRF默认的JSON解析器无法处理文件上传,需要在用户创建视图中新增文件解析器:
from rest_framework.parsers import MultiPartParser, FormParser from rest_framework import generics class UserCreateView(generics.CreateAPIView): serializer_class = UserSerializer # 新增解析器配置 parser_classes = (MultiPartParser, FormParser)
补充说明
Django管理后台可以正常保存头像,是因为后台直接调用模型的默认保存逻辑,会自动处理所有注册的模型字段,不会走你自定义的create_user方法,所以不受影响。
内容的提问来源于stack exchange,提问作者devAR
相关产品推荐
相关产品推荐

