python - django 仅在用户上传后更新个人资料图片
问题描述
当用户不上传图像并保存表单时,我收到以下错误。
Internal Server Error: /user/profile/update
Traceback (most recent call last):
File "\site-packages\django\utils\datastructures.py", line 76, in __getitem__
list_ = super().__getitem__(key)
KeyError: 'img'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "\auth\users\views.py", line 63, in profile_update
image = Image.open(request.FILES['img'].file)
File "\site-packages\django\utils\datastructures.py", line 78, in __getitem__
raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'img'
[16/Jun/2021 09:39:40] "POST /user/profile/update HTTP/1.1" 500 89309
我想检查图像是否为空,然后表单不需要对图像做任何事情,如果图像被上传,那么用它做一些逻辑 - 将它上传到外部 api。
def profile_update(request):
user = request.user
print(user.user_face_img_md5)
if request.method == 'POST':
form = UpdateProfile(request.POST, instance=request.user)
if form.is_valid():
username = form.cleaned_data.get('username')
obj = form.save(commit=False)
if request.FILES['img']:
image = Image.open(request.FILES['img'].file)
if image:
print("Updating image..")
#deleteImage(obj.user_face_img_md5)
#image_md5 = uploadImage(image)
else:
print("No image uploaded")
print(image)
obj.user_face_img_md5 = image_md5
obj.save()
messages.success(
request, f'Account has been updated!')
return redirect('profile')
return render(request, 'users/profile_update.html', {'form': form})
我认为错误来自 request.FILES 并说密钥img
不存在,因此我可以使用它来检查图像是否已上传。但也许我的实现是错误的,我应该检查字典中是否存在密钥。
此外,在检查图像是否已上传后,如果没有 -form.save()
它会自动保存与模型相关的字段吗?因为图像是表单字段而不是模型字段。
class UpdateProfile(forms.ModelForm):
email = forms.EmailField()
img = forms.ImageField(label='img', required=False)
class Meta:
model = TbUser
fields = [some fieLds]
更新
def profile_update(request):
user = request.user
if request.method == 'POST':
form = UpdateProfile(
request.POST, request.FILES or None, instance=request.user,)
if form.is_valid():
username = form.cleaned_data.get('username')
obj = form.save(commit=False)
print(request.POST.get('img'))
if request.POST.get('img'):
image = Image.open(request.FILES['img'].file)
deleteImage(obj.user_face_img_md5)
obj.user_face_img_md5 = uploadImage(image)
else:
print("No image uploaded")
obj.save()
messages.success(
request, f'Account has been updated!')
return redirect('profile')
else:
data = {
'username': user.username,
'email': user.email,
'cellphone': user.cellphone,
'empno': user.empno,
'real_name': user.real_name,
'nfc_id': user.nfc_id,
'sex': user.sex,
'role': user.role,
'department': user.department,
}
form = UpdateProfile(initial=data)
return render(request, 'users/profile_update.html', {'form': form, 'img_str': user.user_face_img_md5})
解决方案
改变你的:
form = UpdateProfile(request.POST, instance=request.user)
对此:
form = UpdateProfile(request.POST, instance=request.user,request.FILES or None)
将修复错误。在表单实例上添加(request.FILES 或 None)以接受包含 img 的文件
推荐阅读
- javascript - 从纯javascript中的函数打开模态
- apache-kafka - 卡夫卡消费者重新平衡监听器不工作
- android - 当我尝试使用 Screengrab 捕获屏幕截图时,我在 fastlane 中的语言设置出现错误
- r - Python 中与 R 的 nlminb 最接近的函数是什么?
- node.js - 升级 mongoose 5.x 后,我的应用程序变得非常慢
- amazon-web-services - 如何获得 AWS Windows 实例的多用户远程访问?
- html - SpringBoot模板html无法加载
- selenium-webdriver - ReportNG - 如何在 reportng usingTestNG Selenium Webdriver 生成的报告中附加屏幕截图
- fortran - 如何覆盖文件fortran?
- wordpress - 简码在产品页面上不起作用