gpt4 book ai didi

python - Django 图像表单不保存图像

转载 作者:行者123 更新时间:2023-12-01 02:23:58 25 4
gpt4 key购买 nike

我有一个涉及上传个人资料图片的表单。我让它工作,这样我就可以在 /admin/ 中上传图像界面并正确显示它们,但我无法获取我的 Modelform保存图像。

这是我所拥有的:

模型.py

class Candidate(models.Model):
UserID = models.ForeignKey(User, on_delete=models.CASCADE)
ElectionID = models.ForeignKey(Election, on_delete=models.CASCADE)
Bio = models.CharField(max_length=500, blank=True)
ProfilePicture = models.ImageField(upload_to="profilepics/", null=True, blank=True)

forms.py

class AddCandidateForm(forms.ModelForm):

class Meta:
model = Candidate
fields = ['ElectionID', 'Bio', 'ProfilePicture']

cand_reg.html(模板)

{% block content %}
<h1>Register as a candidate</h1>
<form method="POST" class="post-form">
{% csrf_token %}
<h2>Select an election:</h2><br>
{{form.ElectionID}}<br>
<h2>Enter your bio:</h2><br>
{{form.Bio}}<br>
<h2>Upload a profile picture:</h2><br>
{{form.ProfilePicture}}<br>
<button type="submit">Register</button>
</form>
{% endblock %}


当我尝试像这样的 View 函数时,我收到错误:
MultiValueDictKeyError at /register/
"'ProfilePicture'"

views.py

def add_candidate(request):
if request.method == 'POST':
form = AddCandidateForm(request.POST, request.FILES)
if form.is_valid():
candidate = form.save(commit=False)
candidate = request.FILES['ProfilePicture']
candidate.UserID = request.user
candidate.save()
return redirect('/home/')
else:
form = AddCandidateForm()

return render(request, 'cand_reg.html', {
"form": form
})

views.py

当我删除有问题的行时,错误就会消失。

def add_candidate(request):
if request.method == 'POST':
form = AddCandidateForm(request.POST, request.FILES)
if form.is_valid():
candidate = form.save(commit=False)
# candidate = request.FILES['ProfilePicture']
candidate.UserID = request.user
candidate.save()
return redirect('/home/')
else:
form = AddCandidateForm()

return render(request, 'cand_reg.html', {
"form": form
})

但是,这实际上并没有保存图像,因此当我尝试在单独的模板中渲染它时,我收到一个错误。

谁能帮我理解为什么图片无法上传?

提前致谢:)

最佳答案

  1. 您必须设置 ProfilePicture模型的属性,不是实例本身 ( candidate = request.FILES['ProfilePicture'] )。

    更改为:

    candidate = form.save(commit=False)
    candidate.ProfilePicture = request.FILES['ProfilePicture']
    candidate.UserID = request.user
    candidate.save()
  2. 更改您的 HTML 表单以接受文件。更改为:<form method="POST" enctype="multipart/form-data" class="post-form"> 。当表单包含文件输入 ( <input type="file" /> ) 时,它的编码方式必须与仅包含文本时使用的编码方式不同。更多 here 。如果您右键单击并检查 {{form.ProfilePicture}}你会发现这实际上是一个文件输入。

额外一个:

  1. 不要以 PascalCase 命名您的类属性( ProfilePictureUserID 等)。使用snake_case代替( profile_pictureuser_id 等)。

关于python - Django 图像表单不保存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47606406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com