Django额外薪资系统审批报错:视图未返回HttpResponse对象
我开发了一个处理轮班津贴、随叫随到补贴等额外薪资的Django Web应用,其中shift子应用负责员工提交轮班详情、经理审批的功能。但经理审批时出现以下错误:
ValueError at /shift/6/
The view shift.views.update_status didn't return an HttpResponse object. It returned None instead.
Request Method: POST
Request URL: http://127.0.0.1:8000/shift/6/
Django Version: 3.2.5
Exception Type: ValueError
Exception Value:
The view shift.views.update_status didn't return an HttpResponse object. It returned None instead.
Exception Location: C:\Users\vikasdange\Anaconda3\lib\site-packages\django\core\handlers\base.py, line 309, in check_response
项目配置代码
根urls.py
urlpatterns = [ path('', include('login.urls')), path('admin/', admin.site.urls), path('ot/', include('ot.urls')), path('oncall/', include('oncall.urls')), path('shift/', include('shift.urls')), path('accounts/', include('accounts.urls')), ]
shift应用urls.py
urlpatterns = [ path("shift", views.shift,name="shift"), path("<int:id>/", views.update_status,name="update_status"), path("shift_details/", views.shift_details,name="shift_details"), ]
核心业务代码
shift应用views.py
def shift_details(request): sdetails = Shift.objects.all() return render(request, 'shift_details.html', {'details':sdetails}) def update_status(request, id): if request.method == 'POST': ar_status = Shift.objects.get(pk=id) fm = shiftforms(request.POST,ar_status) if fm.is_valid(): fm.save() return redirect('/') else: ar_status=Shift.objects.get(id=id) fm = shiftforms(instance=ar_status) return render(request, "update.html", {"Shift":ar_status})
update.html模板
{% extends 'base.html' %} {% block content %} <h4>审批请求</h4> <form action="" method="post"> {% csrf_token %} {{form.as_p}} <table border="1"> <tr> <td>员工ID</td> <td><input type="text" name="id" value="{{Shift.id}}" readonly></td> </tr> <tr> <td>审批状态</td> <td><input type="text" name="status" value="{{Shift.status}}" ></td> </tr> </table> <input type="submit" value="更新"> <a href="{% url 'shift_details' %}">返回列表</a> </form> {% endblock content %}
错误原因分析
update_status视图的POST分支存在逻辑漏洞:当表单验证fm.is_valid()不通过时,代码没有返回任何HttpResponse对象,导致Django抛出"返回None"的错误。
同时存在两个潜在问题:
- 表单初始化时,更新操作的正确写法应为
shiftforms(request.POST, instance=ar_status),当前写法不符合Django表单传参规范。 - 视图未将表单对象
fm传递给模板,导致模板中的{{form.as_p}}无法渲染表单内容。
修复代码
修改shift/views.py中的update_status视图:
def update_status(request, id): ar_status = Shift.objects.get(id=id) if request.method == 'POST': # 正确传递instance参数 fm = shiftforms(request.POST, instance=ar_status) if fm.is_valid(): fm.save() # 重定向到轮班详情列表,更贴合业务逻辑 return redirect('shift_details') # 表单验证不通过时,返回带错误信息的页面 return render(request, "update.html", {"Shift": ar_status, "form": fm}) else: fm = shiftforms(instance=ar_status) # 将表单对象传递给模板 return render(request, "update.html", {"Shift": ar_status, "form": fm})
额外优化建议
如果shiftforms中已包含status字段,可将模板中手动编写的status输入框替换为表单字段,减少重复代码:
{% extends 'base.html' %} {% block content %} <h4>审批请求</h4> <form action="" method="post"> {% csrf_token %} {{ form.as_p }} <!-- 保留只读的员工ID字段 --> <table border="1"> <tr> <td>员工ID</td> <td><input type="text" name="id" value="{{ Shift.id }}" readonly></td> </tr> </table> <input type="submit" value="更新"> <a href="{% url 'shift_details' %}">返回列表</a> </form> {% endblock content %}
内容的提问来源于stack exchange,提问作者Priderays

