Django:表单成功,但未上载图像

2024-09-30 22:27:37 发布

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

型号.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


Tags: pyimageformmodelsrequestbuttonclasssmall
2条回答

dirkgroten's one的补充答复

我已经完全讨厌基于Django函数的视图的传统结构。可以通过反转有效性测试并添加一行来重新计算它们,以便只存在表单的一个实例化。结果更易于阅读,并且对于显示两个或多个表单的视图更容易概括

def raise_funds_medical_3(request):
    args = [request.POST, request.FILES or None] if request.method == "POST" else []
    form = RaiseFundsFrom3(*args)
    if request.method != "POST" or not form.is_valid():
        # unbound form or form not valid
        return render(request,'funds/raise_funds_medical_3.html',{'form':form})

    # form is valid so do the processing and redirect
    check = form.save(commit=False)
    check.user = request.user
    check.save()
    return redirect(<url_pattern>)

如果要处理>;1表格,则测试变为

    if request.method != "POST" or any(
        [ not form.is_valid(), not form2.is_valid(), ...]):

这将强制对所有表单进行.is_valid()评估,即使第一个表单无效,因此all错误消息将显示给用户

在一个复杂的业务应用程序中,处理一个成功的表单提交可能需要比这个简单示例多出几行代码。将它放在末尾,而不是缩进,与所有样板文件(除了return redirect(...))隔离,使事情变得更容易

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

现在,您的表单没有包含保存user所需的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,以便在form无效的情况下也调用return render(...)

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

@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})

相关问题 更多 >