我有一个序列化程序(django rest框架)在get请求上返回模型对象:
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
在我的视图中实例化此序列化程序后,我使用serializer.data返回所有字段的键/值:
class MyModelAPIView(APIView):
def get(self, request, **kwargs):
obj_pk = kwargs.get('pk')
obj = MyModel.objects.get(pk=obj_pk)
serializer = serializers.MyModelSerializer(obj)
return Response(serializer.data)
这是json中返回的内容的一个示例:
{"firstname": "John", "lastname": "doe", "active": true}
但是,我使用JavaScript生成一个表单(动态生成的表单),我想知道每个键/对值的字段类型,因此我可以相应地生成表单。我试图将ModelSerializer子类化,以便返回的JSON看起来像这样:
{"firstname": {"value": "john", "type": "TextField"},
"lastname": {...},
"active": {"value": true, "type": "BooleanField"}}
这将允许我在表单中生成正确的输入类型。得到这个最好的方法是什么? 可能有一种更简单的方法可以使用与此完全不同的Rest Framework从JSON响应动态生成表单(希望不那么繁琐)。如果是这样,我也有兴趣听到它!
谢谢,
答案 0 :(得分:0)
而不是朝着修改JSON数据的方向前进。我创建了一个新的渲染器,受HTMLFormRenderer和JSONRenderer的启发。我遍历data.fields.values生成一个json数组,其中包含带有标签,帮助文本和转义HTML中的实际字段的对象。所以我的ajax动态表单可以很容易地定制和快速。
答案 1 :(得分:0)
示例:
Serializer:
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
查看:
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
URL路由器:
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
查看官方文档中的快速入门文档; http://www.django-rest-framework.org/tutorial/quickstart/
关于表格的渲染; Django REST框架 - JSON API 文档:http://drf-json-api.readthedocs.org/en/latest/
这被设计为仅用作渲染器和解析器,并且不提供JSON API可能期望的任何其他功能。
class ExampleView(generics.ListAPIView):
renderer_classes = (JsonApiRenderer, )
settings.py
REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": (
"rest_framework_json_api.renderers.JsonApiRenderer",
"rest_framework.renderers.BrowsableAPIRenderer",
# Any other renderers
),
"DEFAULT_PARSER_CLASSES": (
"rest_framework_json_api.parsers.JsonApiParser",
"rest_framework.parsers.FormParser",
"rest_framework.parsers.MultiPartParser",
# Any other parsers
),
}
我希望它有所帮助!