我要删除现有的个人资料图片(在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')
.......
答案 0 :(得分:0)
在回答您的问题之前,我应该注意一下,如果您使用user1上载名为image.png
的文件,然后使用user2上载另一个具有相同名称的文件,则user1 profile_pic将显示用户2的profile_pic,以解决此问题应该用一个函数替换upload_to='profile_pics'
并返回上载路径的完整路径:-)
在这里,我为您提供3种解决方案:
upload_to
函数中,始终为每个用户返回一个常数值(例如hash of user id
-使用hashids
),因此,当用户上传新图片时,它将被替换为以前的图片图片在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