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

Django REST API仅显示‘Content’字段,如何恢复表单输入模式?

问题原因及解决方法

为什么会显示纯JSON输入框?

DRF的可浏览API能显示表单输入,核心是它能从视图关联的序列化器中读取字段结构,自动生成对应表单。你当前用的viewsets.ViewSet是最基础的视图集,默认没有绑定序列化器类,且create方法只是手动调用序列化器,没让视图集和序列化器建立关联,导致可浏览API无法识别字段结构,只能退回到纯JSON编辑模式。你修改媒体类型无效,是因为媒体类型控制的是请求/响应格式,和表单生成依赖的序列化器元数据无关。

切换回表单输入模式的方法

方法1:改用ModelViewSet(推荐)

ModelViewSet封装了list、create等默认动作,会自动关联序列化器并生成表单。修改你的views.py:

from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.response import Response

from .models import Asset, Pack
from .serializers import (
    AssetSerializer,
    CreateAssetSerializer,
    PackSerializer,
    CreatePackSerializer,  # 导入之前定义的CreatePackSerializer
)


class AssetViewSet(viewsets.ModelViewSet):
    """API endpoint that allows assets to be viewed or edited."""
    queryset = Asset.objects.all()
    
    def get_serializer_class(self):
        # 不同动作使用对应序列化器
        if self.action == 'create':
            return CreateAssetSerializer
        return AssetSerializer


class PackViewSet(viewsets.ModelViewSet):
    """API endpoint that allows packs to be viewed or edited."""
    queryset = Pack.objects.all()
    
    def get_serializer_class(self):
        if self.action == 'create':
            return CreatePackSerializer
        return PackSerializer

方法2:在ViewSet中显式关联序列化器

如果不想改用ModelViewSet,可以在自定义ViewSet中指定序列化器类,确保视图能识别字段结构:

class AssetViewSet(viewsets.ViewSet):
    """API endpoint that allows assets to be viewed or edited."""
    queryset = Asset.objects.all()
    serializer_class = AssetSerializer  # 指定默认序列化器

    def get_serializer_class(self):
        if self.action == 'create':
            return CreateAssetSerializer
        return super().get_serializer_class()

    def list(self, request):
        serializer = self.get_serializer(self.queryset, many=True)
        return Response(serializer.data)

    def create(self, request):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)

方法3:检查DRF全局配置

确保settings.py中DRF配置包含必要的渲染器和解析器:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',  # 必须保留,负责生成可浏览页面
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',  # 表单数据解析器
        'rest_framework.parsers.MultiPartParser',  # 支持文件上传的解析器
    ],
}

补充说明

你之前定义的CreatePackSerializer未在PackViewSet中使用,修改后记得同步用上,这样Pack的创建接口也会显示表单输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:18:15