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

Django表单提交异常及管理员操作后自动跳转用户页面求助

问题1:表单提交仅部分刷新无法完成提交

先排查基础问题,再针对性处理:

  • 确保表单标签包含method="POST"和{% csrf_token %},避免CSRF验证失败或请求方式错误
  • 如果用AJAX提交,必须在请求头携带CSRF令牌,同时在视图里区分AJAX与普通请求:
    后端视图示例:
    def submit_application(request):
        if request.method == "POST":
            form = ApplicationForm(request.POST)
            if form.is_valid():
                app = form.save()
                # 处理AJAX请求返回JSON,普通请求直接重定向
                if request.headers.get("X-Requested-With") == "XMLHttpRequest":
                    return JsonResponse({"status": "ok", "app_id": app.id})
                return redirect("pending", app_id=app.id)
        form = ApplicationForm()
        return render(request, "apply.html", {"form": form})
    
    前端AJAX示例:
    document.querySelector("#apply-form").addEventListener("submit", (e) => {
        e.preventDefault();
        const formData = new FormData(e.target);
        fetch(e.target.action, {
            method: "POST",
            headers: {
                "X-Requested-With": "XMLHttpRequest",
                "X-CSRFToken": document.querySelector("[name=csrfmiddlewaretoken]").value
            },
            body: formData
        })
        .then(res => res.json())
        .then(data => {
            if (data.status === "ok") {
                window.location.href = `/pending/${data.app_id}/`;
            } else {
                // 将表单错误渲染到页面对应位置
            }
        });
    });
    
  • 若未使用AJAX,检查表单action属性是否正确,避免提交到当前页面导致局部刷新
问题2:Pending页面等待后台处理后自动跳转

用轮询实现(适合新手,无需复杂配置):

  1. 后端新增状态检查接口:
    def check_app_status(request, app_id):
        app = get_object_or_404(Application, id=app_id)
        return JsonResponse({"status": app.status})  # 假设status字段取值:pending/approved/rejected
    
    在urls.py添加对应路由:
    path("check-status/<int:app_id>/", views.check_app_status, name="check_status")
    
  2. Pending页面前端添加轮询逻辑:
    <script>
        const appId = {{ application.id }}; <!-- 模板变量传入申请ID -->
        function pollStatus() {
            fetch(`/check-status/${appId}/`)
            .then(res => res.json())
            .then(data => {
                if (data.status === "approved") {
                    window.location.href = "/approved/";
                } else if (data.status === "rejected") {
                    window.location.href = "/rejected/";
                } else {
                    // 3秒后再次查询状态
                    setTimeout(pollStatus, 3000);
                }
            })
            .catch(err => {
                console.error(err);
                // 出错后延长查询间隔,避免频繁请求
                setTimeout(pollStatus, 5000);
            });
        }
        // 页面加载后启动轮询
        window.onload = pollStatus;
    </script>
    
  3. 管理员在后台修改申请状态后,数据库会实时更新,轮询会获取到最新状态并自动跳转

内容的提问来源于stack exchange,提问作者Tohid Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:43:35