You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django额外薪资系统审批报错:视图未返回HttpResponse对象

解决Django视图返回None导致的ValueError错误

我开发了一个处理轮班津贴、随叫随到补贴等额外薪资的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"的错误。

同时存在两个潜在问题:

  1. 表单初始化时,更新操作的正确写法应为shiftforms(request.POST, instance=ar_status),当前写法不符合Django表单传参规范。
  2. 视图未将表单对象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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:54:21