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

Django无法在JavaScript中获取JSON数据问题排查

Django + JavaScript 帖子展示问题排查与修复

我是Django和JavaScript新手,开发一个简单帖子应用,首页能正常渲染,但通过admin创建的帖子无法通过API获取并展示。手动访问/get_posts时报TypeError,浏览器控制台显示500错误和JSON解析失败。

相关错误信息:

手动访问/get_posts时的TypeError:

Exception Type: TypeError at /get_posts Exception Value: get_posts() takes 0 positional arguments but 1 was given

浏览器控制台错误:

GET http://127.0.0.1:8000/get_posts 500 (Internal Server Error)
Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON

核心问题定位

  1. 视图函数参数缺失:Django视图函数必须接收request作为第一个参数,你的get_posts()未定义该参数,导致调用时抛出TypeError,触发服务器500错误。
  2. JSON解析失败:服务器返回HTML格式的错误页面而非预期的JSON数据,JS尝试解析时自然报错。

具体修复步骤

1. 修正视图函数

修改views.py中的get_posts函数,添加request参数:

def get_posts(request):  # 必须添加request参数
    # 获取所有帖子并按时间倒序排列
    posts = Posts.objects.order_by("-timestamp")
    return JsonResponse([post.serialize() for post in posts], safe=False)

注:posts.order_by("-timestamp").all()可简化为posts.order_by("-timestamp"),因为objects.all()返回的QuerySet排序后无需再次调用all()

2. 优化JavaScript错误处理

为避免服务器错误导致JS代码崩溃,给fetch添加错误捕获逻辑:

document.addEventListener('DOMContentLoaded', function() {
  load_posts();
});

function load_posts() {
  fetch('/get_posts')
  .then(response => {
    if (!response.ok) {
      throw new Error('服务器请求失败');
    }
    return response.json();
  })
  .then(posts => {
    const postsView = document.querySelector('#posts-view');
    postsView.innerHTML = ''; // 清空旧内容,避免重复加载
    posts.forEach(post => {
        let div = document.createElement('div');
        div.className = "post-item row";
        div.innerHTML = `
          <span class="col"><b>${post.text}</b></span>
          <span class="col text-muted">${post.timestamp}</span>
        `;
        postsView.append(div);
    });
  })
  .catch(error => {
    console.error('加载帖子失败:', error);
  });
}

3. 验证路由配置

确保urls.py中的路由配置正确,路径与视图函数对应:

path("get_posts", views.get_posts, name="get_posts"),

4. 确认模板结构

你的index.html已包含id="posts-view"的容器,确保模板继承了正确的基础模板(需包含{% block body %}和{% block script %}区块)。


验证修复

  1. 重启Django服务器
  2. 手动访问http://127.0.0.1:8000/get_posts,应能看到JSON格式的帖子数据
  3. 刷新首页,帖子会正常加载并显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:57:41