在Django REST Framework中如何根据用户性别设置默认头像
核心错误点修正
你现有代码存在三处可直接导致功能失效的问题:
- 访问性别属性的逻辑错误:
CustomUser.gender是访问模型类的属性,无法获取当前关联用户的性别值,应该通过外键关联获取实例的性别:self.user.gender - 保存逻辑顺序错误:你先调用了父类save方法才修改头像字段,修改后没有再次触发保存,更改不会写入数据库。应该先完成默认头像的判断赋值,再执行父类save逻辑
- 类名不匹配:你的用户资料模型类名为
UserProfile,但信号里写的是Profile.objects.create,会触发找不到类的报错
修正后代码
models.py 中UserProfile部分
class UserProfile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profile') profile_pic = models.ImageField(upload_to='profile/', default='default.png', blank=True) def __str__(self): return f'{self.user.first_name} Profile' def save(self, *args, **kwargs): # 先判断是否为默认头像,根据性别替换 if self.profile_pic == 'default.png': if self.user.gender == 'Male': self.profile_pic = 'user_default_m.png' else: self.profile_pic = 'user_default_f.png' # 再执行父类保存逻辑 super(UserProfile, self).save(*args, **kwargs) # 最后执行图片压缩逻辑 uploaded_image = Image.open(self.profile_pic.path) if uploaded_image.height > 300 or uploaded_image.width > 300: output_size = (300, 300) uploaded_image.thumbnail(output_size) uploaded_image.save(self.profile_pic.path)
signals.py
from django.db.models.signals import post_save from django.dispatch import receiver from .models import CustomUser, UserProfile @receiver(post_save, sender=CustomUser) def create_user_profile(sender, instance, created, **kwargs): if created: UserProfile.objects.create(user=instance) @receiver(post_save, sender=CustomUser) def save_user_profile(sender, instance, **kwargs): instance.profile.save()
注意事项
请提前将user_default_m.png、user_default_f.png两个默认头像文件放到你项目配置的MEDIA_ROOT根目录下,和原默认的default.png放在同一路径即可。
内容的提问来源于stack exchange,提问作者Lubna Ather
相关产品推荐
相关产品推荐

