【发布时间】:2017-12-30 14:09:31
【问题描述】:
我有一个带有可选头像的用户配置文件模型,看起来像
#models.py
class UserProfile(models.Model):
avatar = models.ImageField(upload_to=avatars null=True, blank=True)
.
.
.
然后是这样的形式:
#forms.py
class UserProfileForm(forms.ModelForm):
avatar = forms.ImageField(required=False,....)
class Meta:
model = UserProfile
最后,一个视图包括
#views.py
def edit_profile(....)
profile_obj = request.user.userprofile
form = UserProfile(data=request.POST, files=request.FILES, instance=profile_obj)
if form.is_valid():
form.save()
现在,当用于编辑用户个人资料和头像的模板被渲染时,它包含一个Clear 复选框,选中该复选框后,用户可以删除他们的头像照片。它将myuser.avatar 留在<ImageFieldFile: None> 状态,但它不会删除站点本身存储区域中的文件(即jpg、png 或其他文件)。我读到这是Django 1.6 的设计,一切都很好,但是我如何覆盖这个功能,以便文件确实被删除?
从shell来说没有问题:
from myapp.models import UserProfile
user1==UserProfile.objects.all()[0]
user1.avatar.delete()
也删除了jpeg。
编辑:
我尝试使用如下信号:
#models.py
.
.
.
@receiver(post_delete, sender=UserProfile)
def avatar_post_delete_handler(sender, **kwargs):
print 'DEBUG: avatar delete triggered'
avatar = kwargs['instance']
storage, path = avatar.original_image.storage, avatar.original_image.path
storage.delete(path)
但这甚至没有触发,我猜是因为我没有删除UserProfile 对象
当用户选择清除复选框时,它是完整的,而只是头像。
【问题讨论】: