Django中request.is_ajax()返回False,Ajax动态搜索触发页面跳转问题排查
问题排查&解决步骤
1. 修复JS不生效、URL跳转问题
- 首先确认页面已正确引入jQuery依赖,你的代码使用了jQuery语法,未引入会导致JS直接报错停止执行,可在
base.html的</body>标签前添加引入:
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.min.js"></script>
- 阻止表单默认提交行为:你当前的搜索输入框放在form标签内,触发提交会直接刷新页面跳转URL,在JS代码中添加以下逻辑:
// 放在所有JS代码最前面即可 $(".form-inline").on('submit', function(e) { e.preventDefault(); });
- 确保JS绑定事件时DOM已加载完成,将你所有的JS代码包裹在DOM就绪回调中:
$(function() { // 把你现有的所有JS代码放到这里 });
2. 修复request.is_ajax()返回False问题
Django 3.1及以上版本已经正式移除了request.is_ajax()方法,该方法原本通过判断请求头X-Requested-With是否为XMLHttpRequest识别Ajax请求,现在需要你手动实现判断逻辑:
- 首先在
views.py中添加自定义判断函数:
def is_ajax(request): return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' def index(request): # 你原有逻辑不变,把if request.is_ajax(): 替换成 if is_ajax(request): # 原有返回JsonResponse的逻辑不变
- 同时在JS代码开头添加全局Ajax配置,让所有jQuery请求携带对应的请求头:
$.ajaxSetup({ headers: { "X-Requested-With": "XMLHttpRequest" } });
3. 可选优化
如果不想自定义判断函数,也可以直接通过请求的Accept头判断是否需要返回Json数据,把视图中的判断改成:
if request.META.get('HTTP_ACCEPT') == 'application/json': # 返回JsonResponse的逻辑
内容的提问来源于stack exchange,提问作者Akram Baklouti
相关产品推荐
相关产品推荐

