如何在Django中上传用户扩展模型中的个人资料图片



我在将封面图像上传到Django的用户扩展模型时没有收到任何错误,但我看不出我做错了什么,因为它没有给出任何错误,甚至没有更新我的模型。然而,我可以使用这个概念来更改简历,但我不能将封面图像更新为我的用户扩展模型。这里我给源代码

型号.py

class Memer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
mobile = models.CharField(max_length=16, blank=True, null=True)
bio = models.CharField(max_length=150, blank=False, null=False, default="Hey! I'm new here.")
cover = models.ImageField(upload_to='cover-images/%y/%m/%d/', default='cover-images/default/memerrank-bg.jpg', blank=False, null=False)
profile = models.ImageField(upload_to='profile-images/%y/%m/%d/', default='profile-images/default/memerrank-no-dp.jpg', blank=False, null=False)
def __str__(self):
return str(self.user)

表单.py

class UpdateCoverImageForm(forms.ModelForm):
class Meta:
model = Memer
fields = ['cover']

视图.py

def profile(request, username):
try:
user = User.objects.get(username=username)
user_ = User.objects.filter(username=username)
memer = Memer.objects.filter(user=user_[0].id)
except User.DoesNotExist:
raise Http404("Memer does not exist.")
context = {
'user_': user_,
'memer': memer,
}
if request.method == "POST":
bioForm = EditBioForm(data=request.POST, instance=request.user.memer)
coverImageForm = UpdateCoverImageForm(data=request.FILES, instance=request.user.memer)
if bioForm.is_valid():
memer_ = bioForm.save(commit=False)
memer_.save()
messages.success(request, "Bio successfully updated your profile")
return redirect('/profile/'+user_[0].username)
elif coverImageForm.is_valid():
memer_ = coverImageForm.save(commit=False)
memer_.save()
messages.success(request, "Cover Image has been updated successfully!")
# print(coverImageForm)
return redirect('/profile/'+user_[0].username)
else:
messages.error(request, "Something wrong happend")
return redirect('/profile/'+user_[0].username)
return render(request, 'profile.html', context)

profile.html

<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ UpdateCoverImageForm }}
<input type="submit" value="save">
</form>

所以我经历了很多可能性,找到了这个问题的答案https://stackoverflow.com/users/764182/dmitry-belaventsev帮助了我。

因此,这里的问题出现在views.py中。

1.ModelForm构造函数中的前两个位置参数是数据和文件。您应该将data传递给第一个,将files传递给第二个。

2.如果这里没有文件字段,则不更改

bioForm = EditBioForm(data=request.POST, instance=request.user.memer)

3.但这里要改变

coverImageForm = UpdateCoverImageForm(data=request.FILES, instance=request.user.memer)

coverImageForm = UpdateCoverImageForm(request.POST, request.FILES, instance=request.user.memer)

Boom会更新你的文件。

您不会因为代码完全按照您的指示执行而得到任何错误。代码永远不会进入elif语句,这是因为;如果bioForm.is_valid((:"语句将始终返回True。我建议你做一些类似的事情

if request.method == "POST":
bioForm = EditBioForm(data=request.POST, instance=request.user.memer)
coverImageForm = UpdateCoverImageForm(data=request.FILES, instance=request.user.memer)
if bioForm.is_valid() and coverImageForm.is_valid():
memer_ = bioForm.save(commit=False)
memer_ = coverImageForm.save(commit=False)
memer_.save()
memer_.save()
messages.success(request, "Profile successfully updated your profile")
return redirect('/profile/'+user_[0].username)
else:
messages.error(request, "Something wrong happend")
return redirect('/profile/'+user_[0].username)
return render(request, 'profile.html', context)

如果您希望一次更新一个字段,那么我建议您为每个字段创建不同的视图。

最新更新