python - 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
解决方案
您的表单是 a ModelForm
for 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})
推荐阅读
- java - 在通过 Java 使用 Selenium 在 VS Code 中工作时,使用 sendKeys 方法的类型 ByJava(67108964) 未定义方法 sendKeys(String)
- java - Gradle:添加子项目的依赖项作为根项目的依赖项
- java - 从同一个类中的另一个方法调用 void 方法
- statistics - 关于 Blue Sky Open Source-x64 的 BlueSky 统计问题
- html - 如何在不同标签之间添加空格
- actions-on-google - 谷歌语音合成
标签未按预期方式工作 - iis - GCP,尽管存在转发规则,但 IIS 上没有外部 IP
- python - 如何使用 python jenkinsapi 模块解析和更新 jenkins 作业 config.xml
- python - 用于多组比较的 Python 中的 T 检验
- php - 扩展类时找不到错误类