我有一张涉及上传个人资料照片的表单。我有它工作,以便我可以在/admin/
界面上传图像并正确显示它们,但我无法让Modelform
保存图像。
这就是我所拥有的:
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)
class AddCandidateForm(forms.ModelForm):
class Meta:
model = Candidate
fields = ['ElectionID', 'Bio', 'ProfilePicture']
{% 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 %}
当我尝试这样的视图功能时,我得到错误:
MultiValueDictKeyError at /register/
"'ProfilePicture'"
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
})
当我删除有问题的行时,错误就会消失。
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
})
但是,这实际上并没有保存图像,所以当我尝试在单独的模板中渲染它时,我会收到错误。
任何人都可以帮我理解为什么图片无法上传吗?
提前致谢:)
答案 0 :(得分:2)
您必须设置模型的ProfilePicture
属性,不实例本身(candidate = request.FILES['ProfilePicture']
)。
更改为:
candidate = form.save(commit=False)
candidate.ProfilePicture = request.FILES['ProfilePicture']
candidate.UserID = request.user
candidate.save()
将您的HTML表单更改为接受文件。更改为:<form method="POST" enctype="multipart/form-data" class="post-form">
。当表单包含文件输入(<input type="file" />
)时,它的编码必须与它仅包含文本时使用的编码不同。更多here。如果右键单击并检查{{form.ProfilePicture}}
,您将看到这实际上是一个文件输入。
额外的一个:
ProfilePicture
,UserID
等命名)。请改用snake_case(profile_picture
,user_id
等)。