【问题标题】:Django image form isn't saving the imageDjango图像表单没有保存图像
【发布时间】:2018-05-16 07:51:18
【问题描述】:

我有一个涉及上传个人资料图片的表单。我让它工作,以便我可以在/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
    })

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

谁能帮我理解为什么图片没有上传?

提前致谢:)

【问题讨论】:

    标签: python html django django-forms


    【解决方案1】:
    1. 您必须设置模型的ProfilePicture 属性,而不能设置实例本身 (candidate = request.FILES['ProfilePicture'])。

      改为:

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

    额外的一个:

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

    【讨论】:

    • 我做了你建议的改变,但仍然得到同样的错误。另外,您建议的额外更改是否有特殊原因?
    • 按照建议更改enctype 后,仍然出现同样的错误?
    • 啊,是的,就是这样。非常感谢。是什么改变使它发挥作用?
    • 更新了我的答案以反映您的问题。此外,您应该尽量与class atts 中的snake_case 字母保持一致。请帮自己一个忙,阅读PEP8。它不仅可以帮助您,还可以帮助其他 Pythonistas ;)
    猜你喜欢
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多