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

Django项目自定义is_ajax函数失效,Select2 AJAX搜索无响应

Django + Select2 AJAX筛选失效问题排查与解决

问题详情

开发Django项目时,使用Select2实现带搜索/筛选功能的下拉框,采用AJAX请求获取数据,但功能无法正常工作。调试发现自定义的is_ajax(request)函数始终返回false。已知jQuery原生的is_ajax()已废弃,自行编写了两种实现方式均无效。

视图处理代码

@login_required
def job_application_create(request):
    form = JobApplicationForm()
    if is_ajax(request):
        print('TESTING TESTING TESTING TESTING TESTING TESTING TESTING TESTING ')
        term = request.GET.get('term')
        companies = Company.objects.filter(name__icontains=term)
        response_content = list(companies.values())
        return JsonResponse(response_content, safe=False)

自定义is_ajax函数实现(两种均无效)

# 方式一
def is_ajax(request):
    return request.headers.get('x-requested-with') == 'XMLHttpRequest'
# 方式二
def is_ajax(request):
    return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

前端JavaScript代码

<script>
    $(document).ready(function () {
        $('#id_company').select2({
            ajax: {
                url: "{% url 'homepage' %}",
                dataType: 'json',
                processResults: function (data) {
                    return {
                        results: $.map(data, function (item) {
                            return {id: item.id, text: item.name};
                        })
                    };
                }
            },
            minimumInputLength: 1
        });
    });
</script>

解决步骤

  • 修正AJAX请求URL:前端代码中url指向了homepage视图,但实际处理AJAX请求的是job_application_create,需修改为对应的URL名称:

    url: "{% url 'job_application_create' %}"
    

    确保urls.py中已为该视图配置正确的URL名称。

  • 手动添加请求头:虽然Select2默认会携带X-Requested-With头,但可手动显式添加避免丢失:

    ajax: {
        url: "{% url 'job_application_create' %}",
        dataType: 'json',
        headers: {
            'X-Requested-With': 'XMLHttpRequest'
        },
        processResults: function (data) {
            return {
                results: $.map(data, function (item) {
                    return {id: item.id, text: item.name};
                })
            };
        }
    }
    
  • 检查Django中间件:确认django.middleware.common.CommonMiddleware存在于settings.py的MIDDLEWARE列表中,该中间件负责转换请求头到request.META。

  • 调试请求头:在视图中打印所有请求头,确认X-Requested-With是否被正确接收:

    print(request.headers)
    # 或者打印META
    print(request.META)
    
  • 简化判断逻辑:可直接在视图中合并两种判断方式,无需单独函数:

    if request.headers.get('x-requested-with') == 'XMLHttpRequest' or request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest':
        # 处理AJAX请求逻辑
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:56:06