型号.PY
class Campaign(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
campaign_image = models.ImageField(default="profilepic.jpg",upload_to="campaign_pictures")
FORMS.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})
url.PY
path('raise/medical/photo', views.raise_funds_medical_3, name="raise_funds_medical_3"),
筹集资金\u医疗\u 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,则会上载图像,但会出现以下错误:非空约束失败:funds_campaign.user_id
对dirkgroten's one的补充答复
我已经完全讨厌基于Django函数的视图的传统结构。可以通过反转有效性测试并添加一行来重新计算它们,以便只存在表单的一个实例化。结果更易于阅读,并且对于显示两个或多个表单的视图更容易概括
如果要处理>;1表格,则测试变为
这将强制对所有表单进行
.is_valid()
评估,即使第一个表单无效,因此all错误消息将显示给用户在一个复杂的业务应用程序中,处理一个成功的表单提交可能需要比这个简单示例多出几行代码。将它放在末尾,而不是缩进,与所有样板文件(除了
return redirect(...)
)隔离,使事情变得更容易您的表单是
Campaign
的ModelForm
,因此它的instance
必须是Campaign
。不要将request.user
指定为它的instance
现在,您的表单没有包含保存
user
所需的Campaign
字段,因此在保存到数据库之前,您应该在视图中自己分配该字段:您还应该处理表单无效的情况。这非常简单,只需取消缩进视图函数中的最后一个
return
,以便在form
无效的情况下也调用return render(...)
最后,最好的做法是重定向到另一个视图,而不是在表单有效时返回响应。这样,当用户刷新页面时,表单不会再次提交。您的最终代码应该如下所示:
相关问题 更多 >
编程相关推荐