django - 如何在 Django 中删除个人资料图片
问题描述
我创建了一个页面,用户可以在其中上传个人资料图片:[![Page][1]][1] 但我还希望能够完全删除个人资料图片而无需上传其他图片。当用户单击“删除”按钮时,应该会发生这种情况。
这是我的个人资料模型:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default='default.png', upload_to='profile_pics')
def __str__(self):
return f'{self.user.username} Profile'
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
img = Image.open(self.image.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)
这是我的意见.py
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import UserUpdateForm, ProfileUpdateForm
from dashboard.models import Notification
from .models import Profile
@login_required(login_url='account_login')
def dashboard_profile(request):
n = Notification.objects.filter(user=request.user, viewed=False)
if request.method == 'POST':
u_form = UserUpdateForm(request.POST, instance=request.user)
p_form = ProfileUpdateForm(request.POST,
request.FILES,
instance=request.user.profile)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(request, f'Your account has been updated!')
return redirect('dashboard-profile')
else:
u_form = UserUpdateForm(instance=request.user)
p_form = ProfileUpdateForm(instance=request.user.profile)
context = {
'u_form': u_form,
'p_form': p_form,
'full_name' : request.user.username,
'notifications': n
}
return render(request, 'users/profile.html', context)
@login_required(login_url='account_login')
def delete_image(DeleteView):
#delete the image of the users Profile
return redirect('dashboard-profile')
解决方案
我对这个问题的解决方案是在模型中创建另一个函数,该函数Profile
首先删除旧的个人资料图像,然后将图像设置为我的默认Profile
图像。
def SetUserImageDefault(self):
self.user.profile.image.delete(save=False) # delete old image file
self.user.profile.image = 'default.png' # set default image
self.user.profile.save()