首页 > 解决方案 > 提交表单时出现 MultiValueDictKey 错误

问题描述

我是 Django 的新手,我正在一个网站上工作,用户可以在该网站上编辑他的个人资料(名字、姓氏、用户名、电子邮件),还可以使用单独的表单更改他的个人资料图片。个人资料图片表单提交时保存文件,但更新表单在提交表单时显示 'MultiValueDicKeyError at /account/edit' 'profile_pic'。以下是我的看法。

class Profile(models.Model):
    user = models.OneToOneField(User)
    bio = models.CharField(max_length=250,blank=True)
    profile_pic = models.ImageField(upload_to='profile_images', blank=True)

class UpdateUserForm(forms.ModelForm)
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'username', 'email')

class ProfilePic(forms.ModelForm)
    class Meta:
        model = Profile
        fields = ('profile_pic', )


def profile_edit_view(request):
    form = ProfilePic(request.Post or None, request.FILES or None)
    if request.method == 'POST':
        if form.is_valid():
            pp = form.save(commit=False)
            pp.user = request.user
            pp, created = Profile.objects.get_or_create(user=request.user)
            pp.profile_pic = request.FILES['profile_pic']
            pp.save()
            return redirect... 
    else:
         form = ProfilePic()

    updateform = UpdateUserForm(request.POST or None, instance=request.user)
    if request.method == 'POST':
        if updateform.is_valid():
            updateform.save()
            return redirect.... 
    else:
         updateform = UpdateUserForm()

context = {'form':form, 'updateform':updateform}

return render(request, 'profile_edit.html' context)

标签: pythondjango

解决方案


您可以像这样保存表单并让 django 表单处理您的字段。

  def profile_edit_view(request):
        profile_form = ProfilePic()
        updateform = UpdateUserForm()   
        if request.method == 'POST':
            profile_form = ProfilePic(request.POST, request.FILES)
            updateform = UpdateUserForm(request.POST, instance=request.user)   
            if profile_form.is_valid() and updateform.is_valid():
               updateform.save()
               profile = profile_form.save(commit=False)
               profile.user = request.user
               profile.save()
               return redirect ...      
        return render(request, 'profile_edit.html' {'profile_form':profile_form,'updateform':updateform})

更新

我认为你没有在项目/设置中提供这个

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

这在你的 proejct/urls.py

urlpatterns=[
....
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

推荐阅读