You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:36:03