0

我有一個使用Django REST框架的ViewSet,它具有標準路徑和自定義路徑。每個路由的序列化器是不同的。Django REST框架在HTML視圖上顯示多個表單

例子:

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,刪除用戶對象和兩個額外的工作路線上的行動。但是,我無法弄清楚如何在使用BrowsableAPIRenderer時爲自定義路由顯示HTML表單。例如,開發人員能夠看到表格顯示上述放置方法預期的字段,這將非常方便。

我試着爲兩條路線添加get方法,但這對第一條路線來說是不合理的。無論如何,當我轉到路由的URL時,我看不到正確的序列化程序,我看到在serializer_class中指定的序列化程序。

關於唯一我沒有嘗試過的是覆蓋get_serializer_class(),因爲這涉及將每個路由器的每個序列化程序的知識放在一個地方,而不是能夠在路徑方法本身內指定序列化程序...是這個我應該試圖獲得理想的效果嗎?

回答

0

原來我需要而不是使用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字典不同的串行器。比我想象的要容易得多。

相關問題