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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:57:05