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
相关产品推荐
相关产品推荐

