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

如何在Django非静态URL下用Ajax-Jquery获取API数据(无REST框架)

问题解答

一、Ajax中构造包含年份、月份变量的URL

你可以通过字符串拼接或者ES6的模板字符串动态构造带参数的API URL,具体步骤如下:

  1. 先从前端获取user_id、year、month变量(比如从下拉选择框、输入框或页面路由参数中提取)
  2. 按照后端路由规则构造URL:
    • 推荐用ES6模板字符串(写法更简洁清晰):
      // 假设已拿到变量userId、selectedYear、selectedMonth
      const apiUrl = `/blog/${userId}/${selectedYear}/${selectedMonth}/`;
      
    • 传统字符串拼接写法:
      const apiUrl = '/blog/' + userId + '/' + selectedYear + '/' + selectedMonth + '/';
      
  3. 在Ajax请求中使用构造好的URL:
    $.ajax({
        url: apiUrl,
        method: 'GET',
        success: function(data) {
            // 处理返回的文章数据
            console.log(data);
        },
        error: function(xhr) {
            // 处理请求错误
        }
    });
    

注意:要确保前端URL和后端urls.py的路由规则完全匹配,比如后端路由需这样定义:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('blog/<int:user_id>/<int:year>/<int:month>/', views.get_filtered_posts, name='filtered_posts'),
]

二、不使用REST Framework时的序列化方法

不用DRF的话,有三种实用的序列化方式,直接在Django视图中即可实现:

1. 手动构造字典(最灵活)

遍历查询到的文章对象,手动提取需要的字段组成字典列表,再用JsonResponse返回:

# views.py
from django.http import JsonResponse
from .models import Post

def get_filtered_posts(request, user_id, year, month):
    # 筛选对应用户、年月的文章
    posts = Post.objects.filter(
        user_id=user_id,
        created_at__year=year,
        created_at__month=month
    )
    # 手动序列化字段
    serialized_data = []
    for post in posts:
        serialized_data.append({
            'id': post.id,
            'title': post.title,
            'content': post.content,
            'author': post.user.username,
            'created_at': post.created_at.strftime('%Y-%m-%d %H:%M'),
            # 按需添加其他字段
        })
    # safe=False用于返回列表类型数据
    return JsonResponse(serialized_data, safe=False)

2. 使用Django自带的serializers模块

Django内置序列化工具可直接将QuerySet转为JSON,但返回结果包含模型元信息,前端需对应解析:

# views.py
from django.http import HttpResponse
from django.core import serializers
from .models import Post

def get_filtered_posts(request, user_id, year, month):
    posts = Post.objects.filter(
        user_id=user_id,
        created_at__year=year,
        created_at__month=month
    )
    # 指定序列化格式和需要的字段
    json_data = serializers.serialize(
        'json',
        posts,
        fields=('id', 'title', 'content', 'created_at')
    )
    return HttpResponse(json_data, content_type='application/json')

前端解析时需提取每个对象的fields属性:

success: function(data) {
    const posts = JSON.parse(data).map(item => item.fields);
    // 处理posts数据
}

3. 使用values()方法直接返回字典列表

利用QuerySet的values()方法直接获取字典格式数据,适合无需复杂字段处理的场景:

# views.py
from django.http import JsonResponse
from .models import Post

def get_filtered_posts(request, user_id, year, month):
    posts = Post.objects.filter(
        user_id=user_id,
        created_at__year=year,
        created_at__month=month
    ).values('id', 'title', 'content', 'created_at', 'user__username')
    # 将QuerySet转为列表后返回
    return JsonResponse(list(posts), safe=False)

注意:日期时间类型字段会被自动转为ISO格式字符串,前端可直接使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:36:32