Django项目中AJAX调用views.py未返回预期数据,返回整页HTML如何解决?
问题根因
- 你在视图中使用的
render方法的作用是渲染完整的HTML模板并返回整个页面内容,该返回方式仅适用于普通页面跳转请求,不符合AJAX异步获取数据的需求,这就是控制台打印出完整HTML代码的核心原因。
修复步骤
- 修改views.py返回逻辑
首先导入Django的JSON响应类,在视图中区分普通页面请求和AJAX请求,分别返回对应内容:
# 顶部导入依赖 from django.http import JsonResponse # 你的视图函数内部逻辑 # 先完成业务逻辑得到shuffled_list if request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest': # 将模型列表转换为可JSON序列化的结构,根据你的实际需求取对应字段 serialized_list = list(shuffled_list.values('id', 'username', 'card_content' /* 其他你需要返回的字段 */)) return JsonResponse({'duo_filter': serialized_list}) # 普通页面访问仍然走原有渲染逻辑 return render(request, 'cards.html', {'duo_filter': shuffled_list})
- 可选优化AJAX请求配置
明确指定预期返回的数据格式为JSON,避免前端解析异常:
$('#accept').on('click', function() { var accept_value = $('#accept').val(); $.ajax({ url: '/cards/', type: 'POST', data: {'duo_status': accept_value}, headers: { "X-CSRFToken": "{{ csrf_token }}" }, dataType: 'json', // 新增该行声明返回格式 success: function(data) { console.log('Accepted: success') console.log(data.duo_filter) // 此处可直接拿到你需要的列表数据 // 后续自行编写逻辑将数据渲染到页面卡片区域即可 } }) })
注意事项
- 如果
shuffled_list中包含无法直接JSON序列化的字段(如日期类型、外键对象、文件字段等),需要手动将其转换为字符串/字典等可序列化格式后再放入返回列表。 - 原有页面刷新的访问逻辑不会受到影响,只有AJAX异步请求会返回JSON格式数据。
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

