Django REST Framework 在 HTML 视图上显示多种形式

Django REST Framework show multiple forms on HTML view

我有一个使用 Django REST Framework 的 ViewSet,它具有标准路由和自定义路由。每个路由的序列化器都不同。

示例:

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)
        ...

我的一切正常,因此我可以对用户对象执行标准获取、post、放置、删除操作,并且两条额外的路由可以正常工作。但是,我不知道如何在使用 BrowsableAPIRenderer 时为自定义路由显示 HTML 表单。例如,如果开发人员能够看到演示上述 put 方法所需字段的表单,那将非常方便。

我尝试为两条路线添加 get 方法,但这对于第一条路线来说是没有意义的。无论如何,当我转到路由的 URL 时,我没有看到显示正确的序列化程序,我看到在 serializer_class.

中指定的序列化程序

我唯一没有尝试过的是覆盖 get_serializer_class(),因为这涉及将每个路由的每个序列化程序的知识放在一个地方,而不是能够在路由方法本身中指定序列化程序。 .. 这是我应该尝试获得预期效果的方式吗?

事实证明我需要而不是使用serializer_class而是覆盖get_serializer_class。由于这需要一个动作,我可以 if..elif..else 到 return 正确的序列化程序。巧妙地使用字典可以使这变得容易:

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

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

这将为所有操作 return UserSerializer 除非我在 serializers 字典中指定不同的序列化程序。比我想象的要容易。