当用户没有上传图片并保存表单时,我收到以下错误。
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})
答案 0 :(得分:1)
改变你的:
form = UpdateProfile(request.POST, instance=request.user)
为此:
form = UpdateProfile(request.POST, instance=request.user,request.FILES or None)
将修复错误。 在表单实例上添加(request.FILES 或 None)以接受包含 img 的文件