Django如何检测Profile模型的avatar字段是否被用户修改?
实现方案
核心逻辑
- 在表单验证通过后再判断头像是否修改,避免未提交有效数据时误删文件
- 额外判断旧头像不是默认头像再执行删除,防止默认头像被误删
- 可选添加异常捕获处理文件不存在的极端场景
修正后的视图代码
import os from django.conf import settings def editProfile(request): user_profile = request.user.profile form = AuthorForm(instance=user_profile) if request.method == 'POST': # 先保存旧的头像对象 old_avatar = user_profile.avatar # 定义默认头像路径,避免误删默认头像 default_avatar_path = os.path.join(settings.BASE_DIR, 'static/images/default-avatar.png') form = AuthorForm(request.POST, request.FILES, instance=user_profile) if form.is_valid(): # 两种判断修改的方式二选一即可 # 方式1:通过表单内置的modified字段列表判断 if 'avatar' in form.changed_data: # 仅当旧头像非默认、且文件真实存在时执行删除 if old_avatar.path != default_avatar_path and os.path.exists(old_avatar.path): os.remove(old_avatar.path) # 方式2:直接对比新旧avatar对象 # new_avatar = form.cleaned_data.get('avatar') # if new_avatar and new_avatar != old_avatar: # if old_avatar.path != default_avatar_path and os.path.exists(old_avatar.path): # os.remove(old_avatar.path) form.save() return redirect('dashboard') context = {'form': form} return render(request, 'account/edit.html', context)
注意说明
form.changed_data是Django表单内置属性,会自动返回所有用户修改过的字段名列表,判断avatar是否在其中即可准确识别是否上传了新头像- 提前判断旧文件是否存在,可以避免文件已经被删除时报错导致业务中断
- 不要把删除逻辑放在表单验证之前,否则表单验证不通过的情况下也会误删原有头像
内容的提问来源于stack exchange,提问作者user16735766
相关产品推荐
相关产品推荐

