Django REST框架在HTML视图上显示多个表单

Django REST框架在HTML视图上显示多个表单,django,serialization,django-rest-framework,custom-routes,Django,Serialization,Django Rest Framework,Custom Routes,我有一个使用Django REST框架的视图集,它既有标准路由,也有自定义路由。每个路由的序列化程序都不同 例如: class UserViewSet(ViewSet): model = User serializer_class = UserSerializer @decorators.detail_route(methods=['put']) def change_password(self, request, pk, *args, **kwargs):

我有一个使用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和delete操作,另外两个路由也正常工作。但是,我不知道如何在使用
browsableappirender
时显示自定义路由的HTML表单。例如,对于开发人员来说,能够看到演示上述put方法所需字段的表单将非常方便

我尝试为这两个路由添加get方法,但对于第一个路由,这是不合理的。无论如何,当我转到路由的URL时,我看不到正确的序列化程序,我看到了在
serializer\u class
中指定的序列化程序

我唯一没有尝试的是重写
get\u serializer\u class()
,因为这涉及到将每个路由的每个序列化程序的知识放在一个地方,而不是在路由方法本身中指定序列化程序。。。这就是我应该尝试获得所需效果的方法吗?

事实证明,我不需要使用
序列化程序\u类
,而是重写
获取序列化程序\u类
。由于这需要一个操作,我可以
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
字典中指定了不同的序列化程序。比我想象的要简单。

事实证明,我不需要使用
序列化程序\u类
,而是重写
获取序列化程序\u类
。由于这需要一个操作,我可以
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
字典中指定了不同的序列化程序。比我想象的要容易