首页 > 解决方案 > 如何在 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')

标签: djangodjango-modelsdjango-viewsdjango-templates

解决方案


我对这个问题的解决方案是在模型中创建另一个函数,该函数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()

推荐阅读