在django中上传经过身份验证的用户的新图像时,如何删除当前配置文件图像

时间:2019-09-14 10:19:18

标签: django django-models django-forms django-templates django-views

我要删除现有的个人资料图片(在models.py中称为profile_pic),同时上传经过身份验证的用户的新个人资料图片。

下面是views.py,forms.py和models.py的代码示例

如何在views.py或forms.py中上传新图像时实现删除现有图像的功能

注意:请不要使用基于函数的视图

views.py

class UpdateUserProfilePic(UpdateView):
    template_name = 'accounts/signup.html'
    form_class = forms.UserProfilePicUpdateForm
    success_url = reverse_lazy('test')

    def get_object(self):
         return self.request.user

--------- x ------------------------------------- -------

forms.py

 class UserProfilePicUpdateForm(forms.ModelForm):
       class Meta:
            model = User
            fields = ('profile_pic',)

--------- x ------------------------------------- -------

models.py

   class User(AbstractBaseUser):
         .......
         .......
         profile_pic = models.ImageField(
                   upload_to='profile_pics',
                   default='default-profile.png')
         .......

1 个答案:

答案 0 :(得分:0)

在回答您的问题之前,我应该注意一下,如果您使用user1上载名为image.png的文件,然后使用user2上载另一个具有相同名称的文件,则user1 profile_pic将显示用户2的profile_pic,以解决此问题应该用一个函数替换upload_to='profile_pics'并返回上载路径的完整路径:-)

在这里,我为您提供3种解决方案:

  1. 在新的upload_to函数中,始终为每个用户返回一个常数值(例如hash of user id-使用hashids),因此,当用户上传新图片时,它将被替换为以前的图片图片
  2. 忽略该问题,并在项目中保留一些未使用的个人档案图片,过一会儿,如果您认为这导致了问题,请从数据库中获取profile_pics列表,然后删除不在该列表中的文件
  3. UserProfilePicUpdateForm中覆盖save,然后在该代码中删除旧图片(类似这样)

    class UserProfilePicUpdateForm(forms.ModelForm):
        def save(self, commit=True):
            profile_pic =  User.objects.get(pk=self.instance.pk).profile_pic
            instance = super().save(commit)
            if profile_pic != instance.profile_pic:
                # delete old pic