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
相关产品推荐
相关产品推荐

