【问题标题】:Reset Avatar ImageField to Default when User Clear Avatar Through DRF or Django Admin当用户通过 DRF 或 Django Admin 清除 Avatar 时,将 Avatar ImageField 重置为默认值
【发布时间】:2023-02-17 16:57:09
【问题描述】:

我有一个名为 avatar 的 Django 模型 ImageField。我想让用户清除他们的头像,所以Blank = True。问题是当用户清除他们的头像时,ImageField 路径现在是空的。我想要的是,将 ImageField 恢复为默认值。

模型.py

class Profile(models.Model):
    AVATAR_UPLOAD_TO = "account_avatar/"
    DEFAULT_AVATAR = "default.jpg"

    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    avatar = sorl.thumbnail.ImageField(upload_to=AVATAR_UPLOAD_TO, default=AVATAR_UPLOAD_TO+DEFAULT_AVATAR, blank=True, null=True)

我看到一些相关问题Django ImageField overwrites existing path when empty。但这种行为并不完全是我想要的。此答案要求用户上传新头像,因此用户无法清除自己的头像。另一个相关问题Django - How to reset model fields to their default value?。但是我不能在我的模型上实现save()方法

我尝试在 Profile 模型上实现 save() 方法,但它没有按预期工作

def save(self, *args, **kwargs):
    if not self.avatar.name:
        setattr(self, 'avatar.name', self.avatar.field.default)

    super().save(*args, **kwargs)  # Call the "real" save() method.

我是 Django 和 Django Rest Framework 的新手。请帮助我,我几天前就遇到了这个问题。你能帮我解决问题吗?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您只是缺少次要代码,这是您如何在 save() 方法中继续

    class Profile(models.Model):
        AVATAR_UPLOAD_TO = "account_avatar/"
        DEFAULT_AVATAR = "default.jpg"
    
        user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
        avatar = sorl.thumbnail.ImageField(upload_to=AVATAR_UPLOAD_TO, 
        default=AVATAR_UPLOAD_TO+DEFAULT_AVATAR, blank=True, null=True)
    
        def save(self, *args, **kwargs):
            if not self.avatar:
                self.avatar = self.AVATAR_UPLOAD_TO + self.DEFAULT_AVATAR
            super(Profile,self).save(*args, **kwargs)  # Call the "real" save() method.
    

    【讨论】:

    • 非常感谢您的回答。它按我的预期工作。像魅力一样工作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多