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

Django前端更新按钮失效求助(Admin面板功能正常)

Django提交状态更新功能修复方案

一、当前AJAX代码的直接问题

前端用fetch提交的JSON里字段是submission_id,但后端视图里写的是data["subId"],参数名不匹配,导致找不到要修改的提交记录,这就是功能失效的核心原因。

直接修改views.py里的对应行:

# 把原来的subId改成submission_id
submission_id = data["submission_id"]

二、更简单的非AJAX方案(符合你不想用AJAX的需求)

既然觉得AJAX复杂,完全可以用Django原生表单提交,不用写任何JS代码,步骤如下:

1. 修改HTML模板

删掉form上的data属性,给表单设置正确的提交地址,用隐藏字段传递submission_id,同时去掉所有JS代码:

{% extends "base/room_home.html" %}

{% block content %}

<div class="container d-flex align-items-center justify-content-center" style="min-height: 100vh;">
    <div class="text-center">
        <h1>{{ room_bills.title }}</h1>
        <p>截止日期: {{ room_bills.due }}</p>

        <div class="col-3">
            <h3>已缴费成员: </h3>
            <ul>
                {% for submission in submissions %}
                    <li>
                        <a href="proof/{{ submission.user.id }}" target="_blank">{{ submission.user.username }}</a>
                        <form method="POST" action="{% url 'remark_proof_api' room_bills.room.id room_bills.slug %}">
                            {% csrf_token %}
                            <input type="hidden" name="submission_id" value="{{ submission.id }}">
                            <select name="status">
                                <option value="P" {% if submission.status == 'P' %}selected{% endif %}>待审核</option>
                                <option value="A" {% if submission.status == 'A' %}selected{% endif %}>已通过</option>
                                <option value="R" {% if submission.status == 'R' %}selected{% endif %}>已拒绝</option>
                            </select>
                            <button type="submit" class="btn btn-primary">更新</button>
                        </form>
                    </li>
                {% endfor %}
            </ul>
        </div>
        <div class="col-3">
            <h3>未缴费成员: </h3>
            <ul>
                {% for user in did_not_submit %}
                    <li>{{ user.username }}</li>
                {% endfor %}
            </ul>
        </div>
    </div>
</div>

{% endblock %}

2. 调整后端视图

去掉@csrf_exempt(原生表单已经带了csrf_token,不需要豁免),直接从POST表单里取数据,修改后重定向回原页面:

from django.shortcuts import redirect

def remark_proof_api(request, room_id, bills_slug):
    if request.method == "POST":
        submission_id = request.POST.get("submission_id")
        status = request.POST.get("status")

        sub = Submission.objects.get(id=int(submission_id))
        sub.status = status
        sub.save()

        # 提交后回到原来的页面,默认跳转首页防止空值
        return redirect(request.META.get('HTTP_REFERER', '/'))
    return redirect(request.META.get('HTTP_REFERER', '/'))

3. 确认URL配置

确保你的urls.py里有对应的路由,名称要和模板里的{% url %}一致:

# urls.py示例
from django.urls import path
from . import views

urlpatterns = [
    # 其他路由...
    path('room/<int:room_id>/bills/<slug:bills_slug>/status/', views.remark_proof_api, name='remark_proof_api'),
]

这样修改后,点击「更新」按钮就会直接提交表单,修改状态后自动回到原页面,完全不需要AJAX,逻辑简单,也解决了原来的功能失效问题。

内容的提问来源于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 13:50:06