Django图像形式不保存图像

时间:2017-12-02 09:27:56

标签: python html django django-forms

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

这就是我所拥有的:

models.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 %}


当我尝试这样的视图功能时,我得到错误:
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 个答案:

答案 0 :(得分:2)

  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}},您将看到这实际上是一个文件输入。

  3. 额外的一个:

    1. 请,不要在PascalCase中为您的类属性(ProfilePictureUserID等命名)。请改用snake_case(profile_pictureuser_id等)。