如何在Django非静态URL下用Ajax-Jquery获取API数据(无REST框架)
问题解答
一、Ajax中构造包含年份、月份变量的URL
你可以通过字符串拼接或者ES6的模板字符串动态构造带参数的API URL,具体步骤如下:
- 先从前端获取
user_id、year、month变量(比如从下拉选择框、输入框或页面路由参数中提取) - 按照后端路由规则构造URL:
- 推荐用ES6模板字符串(写法更简洁清晰):
// 假设已拿到变量userId、selectedYear、selectedMonth const apiUrl = `/blog/${userId}/${selectedYear}/${selectedMonth}/`; - 传统字符串拼接写法:
const apiUrl = '/blog/' + userId + '/' + selectedYear + '/' + selectedMonth + '/';
- 推荐用ES6模板字符串(写法更简洁清晰):
- 在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
相关产品推荐
相关产品推荐

