Django预算网站状态修改失效问题求助
Django预算网站状态修改功能修复方案
问题排查与修复步骤
1. 前端下拉框未渲染当前数据库状态
当前模板中的<select>只会默认选中第一个选项(Pending),不会根据submission.status的值自动匹配选中状态,导致刷新页面后显示回默认值。
修改view-bills-admin.html中的select部分:
<select name="status" id="{{ submission.id }}" onblur="postStatus('{{ submission.id }}')"> <option value="P" {% if submission.status == 'P' %}selected{% endif %}>Pending</option> <option value="A" {% if submission.status == 'A' %}selected{% endif %}>Accepted</option> <option value="R" {% if submission.status == 'R' %}selected{% endif %}>Rejected</option> </select>
2. API参数名不匹配
前端发送的参数键名是submissionId,但后端视图中用data["submission_id"]接收,导致无法正确获取ID,数据库状态根本没有更新。
修改views.py中的参数获取逻辑:
submission_id = data["submissionId"] # 改为和前端一致的键名
3. CSRF安全问题(可选但推荐)
当前使用@csrf_exempt跳过CSRF验证存在安全风险,建议在请求中携带CSRF令牌:
修改view-bills-admin.html中的fetch请求:
function postStatus(submissionId) { const selectElement = document.getElementById(submissionId); const status = selectElement.value; // 获取页面中的CSRF令牌 const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value; fetch(`/room/{{ room.join_code }}/bills/{{ bills.slug }}/status/`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRFToken': csrfToken // 添加CSRF令牌请求头 }, body: JSON.stringify({ "submissionId": submissionId, "status": status }) }) // 可选:添加错误处理便于调试 .then(response => { if (!response.ok) throw new Error('状态更新请求失败'); return response.json(); }) .catch(error => console.error('更新出错:', error)); }
同时在模板的form标签内添加CSRF令牌:
<form> {% csrf_token %} <label for="status">Status:</label> <!-- 其他内容 --> </form>
完成后可移除views.py中的@csrf_exempt装饰器,恢复CSRF保护。
4. 增强数据异常处理
为避免无效ID导致的报错,在视图中添加异常捕获:
try: sub = Submission.objects.get(id=int(submission_id)) except (ValueError, Submission.DoesNotExist): return JsonResponse({"success": False, "error": "无效的提交ID"}, status=400)
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

