【问题标题】:Django REST Framework show multiple forms on HTML viewDjango REST Framework 在 HTML 视图上显示多个表单
【发布时间】:2015-07-21 19:28:48
【问题描述】:

我有一个使用 Django REST 框架的 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)
        ...

我的一切工作正常,因此我可以对 User 对象执行标准的 get、post、put、delete 操作,并且两个额外的路由工作。但是,我不知道如何在使用BrowsableAPIRenderer 时显示自定义路由的 HTML 表单。例如,对于开发人员来说,能够看到展示上述 put 方法所期望的字段的表单将非常方便。

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

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

【问题讨论】:

    标签: django serialization django-rest-framework custom-routes


    【解决方案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 字典中指定不同的序列化程序。比我想象的要容易。

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 2020-06-03
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多