首页 > 解决方案 > Django:表单成功但图片未上传

问题描述

模型.PY

class Campaign(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    campaign_image = models.ImageField(default="profilepic.jpg",upload_to="campaign_pictures")

表格.PY

class RaiseFundsFrom3(forms.ModelForm):
    class Meta:
        model = Campaign
        fields = ['campaign_image']

意见.PY

@login_required
def raise_funds_medical_3(request):
    if request.method == 'POST':
        form = RaiseFundsFrom3(request.POST, request.FILES or None, instance=request.user)
        if form.is_valid():
            check = form.save(commit=False)
            check.save()
            return HttpResponse('form worked')
    else:
        form = RaiseFundsFrom3()
        return render(request,'funds/raise_funds_medical_3.html',{'form':form})

URLS.PY

path('raise/medical/photo', views.raise_funds_medical_3, name="raise_funds_medical_3"),

raise_funds_medical_3.html

<form method="post" enctype="multipart/form-data">
  {% csrf_token %}
  <div class="form-group pt-2">
    <small>Photo formats must be PNG / JPG / JPEG</small>
    <input type="file" name="campaign_image" />
  </div>
  <button class="btn btn-lg button_bfg_blue" type="submit"> <small><b> NEXT  </b></small> </button>
</form>

在表单提交时,我没有收到任何错误,但图像未上传到所需的文件夹。但是,在views.py 中的raise_funds_medical_3 函数中,如果我删除instance=request.user,图像会被上传,但出现以下错误:NOT NULL 约束失败:funds_campaign.user_id

标签: pythondjangodjango-file-upload

解决方案


您的表单是 a ModelFormfor a Campaign,因此它instance必须是 a Campaign。不要指定request.user为它instance

现在,您的表单不包括user保存 a 所需的字段Campaign,因此您应该在保存到数据库之前自己在视图中分配它:

campaign = form.save(commit=False)  # this gives your the form's instance
campaign.user = request.user  # this assigns the user
campaign.save()  # this commits to the database

此外,您应该处理表单无效的情况。这很简单,只需取消缩进视图函数中的最后一个return,以便在无效return render(...)的情况下也会调用它。form

最后,最好不要在表单有效时返回响应,而是重定向到另一个视图。这样,当用户刷新页面时,表单就不会再次提交。您的最终代码应如下所示:

@login_required
def raise_funds_medical_3(request):
    if request.method == 'POST':
        form = RaiseFundsFrom3(request.POST, request.FILES or None)
        if form.is_valid():
            check = form.save(commit=False)
            check.user = request.user
            check.save()
            return redirect(<url_pattern>)
    else:
        form = RaiseFundsFrom3()
    return render(request,'funds/raise_funds_medical_3.html',{'form':form})

推荐阅读