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