首页 > 解决方案 > 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})

标签: pythondjangodjango-modelsdjango-viewsdjango-forms

解决方案


改变你的:

 form = UpdateProfile(request.POST, instance=request.user)

对此:

form = UpdateProfile(request.POST, instance=request.user,request.FILES or None)

将修复错误。在表单实例上添加(request.FILES 或 None)以接受包含 img 的文件


推荐阅读