Django图像表单没有保存图像

2024-10-03 21:28:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表格,涉及上传个人资料图片。我可以在/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)

你知道吗表单.py

class AddCandidateForm(forms.ModelForm):

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

坎德_注册.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'"

你知道吗视图.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
    })

你知道吗视图.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
    })

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

有人能帮我理解为什么图片没有上传吗?你知道吗

提前感谢:)


Tags: pybrformreturnifmodelsrequestsave
1条回答
网友
1楼 · 发布于 2024-10-03 21:28:13
  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\u大小写(profile_pictureuser_id等)。你知道吗

相关问题 更多 >