Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:用户上传文件和更新数据库中的记录时遇到问题_Python_Django - Fatal编程技术网

Python Django:用户上传文件和更新数据库中的记录时遇到问题

Python Django:用户上传文件和更新数据库中的记录时遇到问题,python,django,Python,Django,对于我的django项目,我使用的是一个定制的用户模型,这很好用。我还有一个页面,允许用户编辑自己的个人资料,这也可以正常工作 我刚刚在我的用户模型中添加了一个ImageField字段,用于一个化身图像。但是,我在让用户自己更新图像方面遇到了麻烦。它在管理界面中运行良好,但在我的用户窗体中不起作用 以下是相关的part models.py # Generates the path for uploaded avatar images def upload_avatar_path(instance

对于我的django项目,我使用的是一个定制的用户模型,这很好用。我还有一个页面,允许用户编辑自己的个人资料,这也可以正常工作

我刚刚在我的用户模型中添加了一个ImageField字段,用于一个化身图像。但是,我在让用户自己更新图像方面遇到了麻烦。它在管理界面中运行良好,但在我的用户窗体中不起作用

以下是相关的part models.py

# Generates the path for uploaded avatar images
def upload_avatar_path(instance, filename):
    ext = filename.split('.')[-1]
    return 'user/{0}/avatar.{1}'.format(instance.username, ext)


# Users
class User(AbstractBaseUser):
    """
    Custom user model for amvl.
    """
    username = models.CharField(
        unique=True,
        max_length=50,
    )

    avatar = models.ImageField(
        upload_to=upload_avatar_path,
        default='user/default.png'
    )

    bio = models.TextField()


class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['avatar', 'bio']
如您所见,用户编辑其配置文件时使用的表单是ModelForm

这是views.py

def profile_edit(request, profile):
    # Check if logged in user is the same as the profile edit page
    if request.user.username == profile:
        profile = User.objects.get(username=request.user.username)
        # If this is a form submission
        if request.method == 'POST':
            form = ProfileUpdateForm(request.POST, request.FILES)
            if form.is_valid():
                try:
                    update = ProfileUpdateForm(
                        request.POST,
                        request.FILES,
                        instance=profile,
                    )
                    update.save()
                    return HttpResponse("UPDATED")
                except:
                    return HttpResponse('FAILED')
        else:
            form = ProfileUpdateForm(instance=profile)
            context = {
                'form': form,
            }
            return render(request, 'user/profile_edit.html', context)
    else:
        return HttpResponse("NOT ALLOWED")
这里的一切都正常工作,除了更新化身字段。有趣的是,当我提交表单时,返回的是“UPDATED”,表明它有效。但是当我检查时,化身图像没有更新,即使其他字段也没有更新

我看到的其他示例似乎建议我需要使用
request.FILES['avatar']
来保存记录,但当我这样做时,它会返回“FAILED”


当我删除
try
except
语句以查看调试信息时,其在/user/admin/edit/,
“'avatar'”
处显示一个
多值DictKeyError。(当我使用
request.FILES['avatar']
时)

根据的Django文档,由于您使用的是
ModelForm
,您应该使用:

 if request.method == 'POST':
    form = ProfileUpdateForm(request.POST, request.FILES)
    if form.is_valid():
        form.save()
        return HttpResponseRedirect('/success/url/')
如果您没有使用
模型形式
… …但您正在构建自己的一个,请使用:

if request.method == 'POST':
    form = ProfileUpdateForm(request.POST, request.FILES)
    if form.is_valid():
        instance = User(avatar=request.FILES['avatar'])
        instance.save()
        return HttpResponseRedirect('/success/url/')
现在,如果它仍然引发一个
多值dictKeyError
(我实际上不确定该给键哪个),请尝试捕获异常以获取
请求.FILES的键:

try:
    instance = User(avatar=request.FILES['avatar'])
except MultiValueDictKeyError:
    raise KeyError('Keys for `request.FILES` are {}'.format(request.FILES.keys()))

我已经弄明白了。它与我的python代码或Django无关,我的HTML表单缺少它的
enctype=“multipart/form data”
属性。

您是否尝试过在使用
request.FILES['avatar]
时不捕获异常以查看Django的抱怨?永远不要捕获空白异常。我们和你都不知道出了什么问题,因为你隐藏了Django将提供给你的所有有用信息。删除所有这些,让我们看看到底发生了什么。啊,是的,很抱歉,我已经更新了原来的帖子。我以前检查过调试信息,只是没有把它放在帖子里。至于你的第一段代码,是的,我看到了,我的代码基本上是一样的。但是,我相信这段代码将在数据库中创建一个新条目,而不是更新当前条目。这就是我的代码中的
instance=profile
。至于第二部分,它可能会帮助其他人找到这个问题,但不是我。