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

使用Django REST Framework创建API遇POST请求400错误求助

解决DRF POST请求400 Bad Request错误的排查步骤

第一步:先获取详细错误信息

400只是笼统的错误提示,必须拿到具体错误内容才能定位问题:

  • 前端修改代码,添加catch块打印详细错误:
axios.post('/api/posts/', form, {
    "headers": {
        'Content-Type': 'application/json',
    }
})
.then(response => console.log(response.data))
.catch(error => {
    console.error('请求错误详情:', error.response.data); // 打印具体错误信息
});
  • 或者后端临时在视图里添加调试代码:
def post(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data)
    if not serializer.is_valid():
        print(serializer.errors) # 控制台输出错误详情
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    return self.create(request, *args, **kwargs)

常见问题及修复方案

1. author字段未正确传递

author是必填外键,前端需要传递当前登录用户的ID,如果没传、传错ID或用户未登录,都会触发验证失败。

更合理的做法是后端自动绑定当前用户,不需要前端传递:

  • 修改视图类,重写perform_create方法:
class PostList(GenericAPIView, ListModelMixin, CreateModelMixin):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)
    
    def perform_create(self, serializer):
        # 自动设置当前登录用户为作者
        serializer.save(author=self.request.user)
  • 同时修改序列化器,把不需要前端提交的字段设为只读:
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ["author", "title", "text", "pk", 'publicationDate']
        read_only_fields = ["pk", "publicationDate", "author"] # 禁止前端修改这些字段

2. 序列化器包含不必要的可写字段

pk是自动生成的主键,publicationDate允许为空且由publish方法控制,这两个字段都不应该开放给前端提交,必须设为只读(如上例)。

3. 模型creationDate默认值错误

当前代码中creationDate = models.DateTimeField(default=timezone.now())会导致所有新创建的Post的creationDate固定为项目启动时间,改为不带括号的函数引用即可:

creationDate = models.DateTimeField(default=timezone.now)

4. 前端请求数据格式冲突

如果form是FormData对象,手动设置Content-Type: application/json会导致数据解析失败,因为FormData默认应使用multipart/form-data;如果是JSON对象,axios会自动设置正确的请求头,可去掉手动配置的headers:

axios.post('/api/posts/', form)
.then(response => console.log(response.data))
.catch(error => console.error('请求错误详情:', error.response.data));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:40:39