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
字典中指定不同的序列化程序。比我想象的要容易。
我有一个使用 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
字典中指定不同的序列化程序。比我想象的要容易。