Django的REST框架显示在HTML视图多种形式(Django REST Framework s

2019-10-24 01:59发布

我有使用具有标准和定制的路线Django的REST框架一个视图集。 各条路线的串行器是不同的。

例:

class UserViewSet(ViewSet):

    model = User
    serializer_class = UserSerializer

    @decorators.detail_route(methods=['put'])
    def change_password(self, request, pk, *args, **kwargs):
        serializer = UserChangePasswordSerializer(data=request.data)
        ...

    @decorators.detail_route(methods=['put'])
    def update_prefs(self, request, *args, **kwargs):
        serializer = UserPreferencesSerializer(data=request.data)
        ...

我所拥有的一切工作,这样我可以执行标准的GET,POST,PUT,删除用户对象和两个额外的工作路线上的行动。 但是,我想不出如何使用时,使HTML表单自定义路线显示BrowsableAPIRenderer 。 这将是非常方便的为开发者能够看到的形式展现,预计上述put方法的领域,例如。

我尝试添加了两条路线get方法,但这是无意义的为第一个。 无论如何,我没有看到显示正确的序列化,当我去的URL路径,我看到在指定的串行serializer_class

关于我还没有尝试过压倒一切的唯一的事情get_serializer_class()因为这涉及到把每一个串行的知识在一个地方每一个路由,而不是能够指定路由方法本身的序列化...这是我的方式应设法得到预期的效果?

Answer 1:

事实证明,我需要使用serializer_class ,而是覆盖get_serializer_class 。 由于这需要一个动作,我可以if..elif..else上回到正确的串行器。 巧妙地运用字典的,然后让一切变得简单:

serializers = {
    'DEFAULT': UserSerializer,
    'password_update': PasswordUpdateSerializer,
    'register': UserRegisterSerializer,
}

def get_serializer_class(self, *args, **kwargs):
    return self.serializers.get(self.action, self.serializers['DEFAULT'])

这将返回UserSerializer一切行动,除非我指定的不同的串行serializers字典。 更容易比我想象的那样。



文章来源: Django REST Framework show multiple forms on HTML view