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

Django应用中如何正确响应AJAX请求,避免返回HTML内容?

解决Django AJAX返回HTML的问题,改用非HTML响应更新页面

我来帮你搞定这个问题~首先得明确:你现在的AJAX用load()直接拉取HTML片段,虽然能用,但你想改成后端不返回HTML,那核心思路是后端返回JSON格式的数据,前端拿到数据后自己处理页面更新——这样既符合无刷新原则,又避免了后端直接吐HTML的情况。

第一步:修改Django视图,返回JSON而非HTML

首先,Django里有专门的JsonResponse类用来返回JSON数据,比手动构造响应方便多了。另外要注意:新版本Django里request.is_ajax()已经被弃用了,推荐用请求头来判断是否是AJAX请求。

修改后的views.py示例:

from django.http import JsonResponse

def your_view_name(request):
    # 你的上下文逻辑,比如获取国家数据
    context = {
        'countries': Country.objects.all(),
        # 其他上下文数据...
    }

    # 判断是否为AJAX请求(适配新版本Django)
    if request.headers.get('X-Requested-With') != 'XMLHttpRequest':
        return render(request, "selectui/index.html", context)
    
    # 将查询集转成可序列化的列表(Django查询集不能直接序列化)
    serialized_countries = list(context['countries'].values('id', 'name', 'continent'))
    # 返回JSON,包含数据和你需要传递的URL(比如当前请求的URL)
    return JsonResponse({
        'countries': serialized_countries,
        'current_url': request.path  # 如果需要传递URL,这里可以放你要给前端的地址
    })

这里我们把原来返回HTML的逻辑改成了返回序列化后的国家数据,同时可以附带需要传递的URL信息——完全没有HTML内容,纯数据输出。

第二步:调整前端AJAX脚本,处理JSON响应

你原来用的$("#tableContainer").load(url)是直接把URL返回的HTML插入容器,现在后端返回的是JSON,所以得换成$.get()或者$.ajax()来接收数据,然后自己生成HTML插入页面。

修改后的AJAX脚本示例:

$(function() { 
  "use strict"; 
  $("#continentMenu a").on("click", function(event) { 
    event.preventDefault(); 
    var url = $(this).attr("href"); 
    $("#continentName").text($(this).text()); 

    // 改用$.get获取JSON数据
    $.get(url, function(response) {
      // 从响应中拿到国家数据
      const countries = response.countries;
      // 手动生成表格HTML(也可以用前端模板引擎,比如Handlebars,更优雅)
      let tableHtml = `
        <table class="table">
          <thead>
            <tr>
              <th>ID</th>
              <th>国家名称</th>
              <th>所属大洲</th>
            </tr>
          </thead>
          <tbody>
      `;
      countries.forEach(country => {
        tableHtml += `
          <tr>
            <td>${country.id}</td>
            <td>${country.name}</td>
            <td>${country.continent}</td>
          </tr>
        `;
      });
      tableHtml += `
          </tbody>
        </table>
      `;
      // 把生成的HTML插入容器
      $("#tableContainer").html(tableHtml);

      // 如果需要用返回的URL,比如记录或者做其他操作
      console.log('当前请求的URL:', response.current_url);
    });
  }); 
});

如果你只是想传递正确的URL而非数据

如果你的需求只是让后端返回一个正确的目标URL,前端再用这个URL加载内容(还是会拉HTML,但后端这次返回的是JSON),那可以简化:

后端返回:

return JsonResponse({'target_url': '/path/to/correct/page/'})

前端处理:

$.get(url, function(response) {
  $("#tableContainer").load(response.target_url);
});

不过这种方式其实还是会加载HTML,只是中间多了一步JSON传递URL,更推荐第一种“后端返回数据,前端渲染HTML”的方式,完全符合前后端分离的思路。

额外提醒

  • 确保你的Django视图里的查询集已经被正确序列化:如果用了复杂的模型字段(比如ForeignKey),可能需要用django-rest-framework的序列化器来处理,会更方便。
  • 前端生成HTML的时候要注意XSS风险,如果用户输入的内容可能包含恶意代码,记得用text()方法转义,或者用模板引擎来处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:30:59