如何在JavaScript中创建Django的Sounds模型对象?
嗨,这个问题太常见啦——前端JavaScript根本没法直接调用Django的ORM操作数据库,毕竟前后端是完全分离的执行环境(哪怕是嵌在Django模板里的JS也不行),必须通过后端API接口来中转操作。下面给你几个实用的落地方案:
方案1:用普通Django视图写基础接口
这是最入门的实现方式,不需要额外依赖:
第一步:后端写处理创建请求的视图
在views.py里新增一个接收POST请求的视图函数:
from django.http import JsonResponse from .models import Sounds from django.views.decorators.csrf import csrf_exempt import json # 注意:生产环境别直接用csrf_exempt,后面会说安全处理 @csrf_exempt def create_sound(request): if request.method == 'POST': try: # 解析前端传来的JSON数据 data = json.loads(request.body) consonant = data.get('consonant', '') vowel = data.get('vowel', '') # 调用ORM创建对象 sound = Sounds.objects.create(consonant=consonant, vowel=vowel) # 返回创建成功的响应 return JsonResponse({ 'status': 'success', 'id': sound.id, 'consonant': sound.consonant, 'vowel': sound.vowel }, status=201) except Exception as e: return JsonResponse({'status': 'error', 'message': str(e)}, status=400) else: return JsonResponse({'status': 'error', 'message': '仅支持POST请求'}, status=405)
第二步:配置路由
在urls.py里给这个视图加个访问路径:
from django.urls import path from .views import create_sound urlpatterns = [ # 你的其他路由... path('api/create-sound/', create_sound, name='create_sound'), ]
第三步:前端JS发送请求
用浏览器原生的fetch或者第三方库(比如axios)发送POST请求:
// 构造要提交的数据 const soundData = { consonant: 'b', vowel: 'a' }; fetch('/api/create-sound/', { method: 'POST', headers: { 'Content-Type': 'application/json', // 生产环境必须加CSRF防护,从Django模板里获取token: // 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value }, body: JSON.stringify(soundData) }) .then(response => response.json()) .then(data => { if (data.status === 'success') { console.log('发音条目创建成功:', data); } else { console.error('创建失败:', data.message); } }) .catch(error => console.error('请求出错:', error));
安全提醒:生产环境一定要去掉@csrf_exempt,在Django模板里渲染CSRF token,然后在JS请求里带上X-CSRFToken头,避免跨站请求伪造攻击。
方案2:用Django REST Framework(DRF)快速构建API(推荐)
如果你的项目需要更多数据库操作(比如查询、更新、删除),DRF能帮你省超多重复代码:
第一步:安装并配置DRF
先安装依赖:
pip install djangorestframework
然后在settings.py的INSTALLED_APPS里添加:
INSTALLED_APPS = [ # 你的其他应用... 'rest_framework', ]
第二步:写序列化器
新建serializers.py,用来处理模型和JSON数据的转换:
from rest_framework import serializers from .models import Sounds class SoundSerializer(serializers.ModelSerializer): class Meta: model = Sounds fields = ['id', 'consonant', 'vowel']
第三步:写视图(两种方式可选)
方式A:用APIView写单一创建接口
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import Sounds from .serializers import SoundSerializer class SoundCreateAPIView(APIView): def post(self, request): serializer = SoundSerializer(data=request.data) if serializer.is_valid(): serializer.save() # 自动调用ORM创建对象 return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
方式B:用ModelViewSet一键实现增删改查
如果需要完整的CRUD操作,用这个更高效:
from rest_framework import viewsets from .models import Sounds from .serializers import SoundSerializer class SoundViewSet(viewsets.ModelViewSet): queryset = Sounds.objects.all() serializer_class = SoundSerializer
第四步:配置路由
如果用的是ModelViewSet,可以用DRF的路由自动生成:
from django.urls import path, include from rest_framework.routers import DefaultRouter from .views import SoundViewSet router = DefaultRouter() router.register(r'api/sounds', SoundViewSet) urlpatterns = [ # 你的其他路由... path('', include(router.urls)), ]
前端请求方式和方案1类似,只是请求URL变成/api/sounds/,DRF会自动处理数据验证、序列化,还自带可浏览的API文档(直接访问/api/sounds/就能看到)。
核心逻辑总结
不管用哪种方案,本质都是:前端通过HTTP请求把数据传给后端接口,后端接口调用Django ORM完成数据库操作,再把结果返回给前端——这是前后端交互的标准模式,也是唯一能实现你需求的路径。
内容的提问来源于stack exchange,提问作者sy89
相关产品推荐
相关产品推荐

