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

使用Ajax向Django视图提交表单数据,按月过滤数据遇403禁止错误

解决用月份过滤数据时的403 Forbidden错误

首先,403错误通常和CSRF保护或者权限控制有关,咱们结合你的代码一步步排查:

1. 先修复表单的基础问题(虽非直接403原因,但会导致后续拿不到过滤值)

你的<select>标签缺少name属性,后端无法获取选中的月份值,先补上:

<form id="month-form" method="post">
    {% csrf_token %}
    <select id="month-select" name="selected_month" class="selectpicker">
        <option value="03">3月</option>
        <option value="04">4月</option>
        <!-- 其他月份选项 -->
    </select>
    <!-- 记得添加提交按钮,否则无法触发表单提交 -->
    <button type="submit">过滤数据</button>
</form>

(另外,<option>的name属性是无效的,不需要设置,把月份值放在value里就足够了)

2. 排查CSRF令牌的传递问题

虽然你已经加了{% csrf_token %},但如果是用AJAX异步提交表单,需要手动把CSRF令牌加到请求头里,否则Django的CSRF保护机制会拦截请求并返回403。如果是AJAX提交,你可以这样处理:

document.getElementById('month-form').addEventListener('submit', function(e) {
    e.preventDefault();
    // 获取CSRF令牌
    const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;
    // 获取选中的月份
    const selectedMonth = document.getElementById('month-select').value;
    
    fetch('/your-filter-view-url/', {
        method: 'POST',
        headers: {
            'X-CSRFToken': csrfToken,
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: `selected_month=${selectedMonth}`
    })
    .then(response => response.json())
    .then(data => {
        // 在这里处理返回的过滤后数据
    });
});

3. 检查视图的权限控制设置

如果你的视图没有做权限验证,或者当前用户未登录就访问,也可能返回403。确保视图添加了正确的权限装饰器:

from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from .models import FuelOperation

@login_required  # 确保只有登录用户才能访问该视图
def filter_fuel_data(request):
    if request.method == 'POST':
        selected_month = request.POST.get('selected_month')
        # 根据月份过滤数据:注意将字符串转成整数匹配日期的月份
        filtered_data = FuelOperation.objects.filter(date__month=int(selected_month))
        return render(request, 'Template.html', {'filtered_data': filtered_data})
    # GET请求时返回全部数据
    all_data = FuelOperation.objects.all()
    return render(request, 'Template.html', {'filtered_data': all_data})

如果不需要登录验证,要确保视图没有被其他权限装饰器(比如@permission_required)限制,或者当前用户满足这些权限要求。

4. 临时验证(不推荐上线使用)

如果你想快速确认是不是CSRF保护导致的问题,可以临时给视图添加@csrf_exempt装饰器关闭CSRF验证,但上线前一定要移除这个装饰器,否则会带来安全风险:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def filter_fuel_data(request):
    # 视图逻辑

按照上面的步骤排查,应该能解决403错误,同时实现用选中月份过滤数据的功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:20:45