Serializer继承自ModelForm和字段类型/表单类型

时间:2015-06-18 21:27:01

标签: django django-models django-forms django-rest-framework

我有一个序列化程序(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响应动态生成表单(希望不那么繁琐)。如果是这样,我也有兴趣听到它!

谢谢,

2 个答案:

答案 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
    ),
}

我希望它有所帮助!