I want to call a function of a viewset in another viewset, with POST method. I don't known how to do that :(, I've this error "GET method not allowed" :
url from initial AccessViewset :
access_level_add = accesslevel.AccessViewSet.as_view({"post": "add"})
url from LevelsViewset who need to make a POST :
add_level_by_departement = levels.LevelsViewSet.as_view({"get": "write"})
Here the "initial" POST function. I remove all unnecessary lines :
@action(detail=True, methods=["POST"])
def add(self, request):
try:
data = request.data
serializer = AccessSerializer(data=data)
response = self.RESPONSE_ACCESS_LEVEL
if serializer.is_valid():
serializer.save()
response["request_params"] = serializer.data
response["result"] = {"code_http": status.HTTP_201_CREATED}
return Response(response, status=status.HTTP_201_CREATED)
else:
response["message_error"] = serializer.errors
response["request_params"] = serializer.data
except Exception as e:
message = str(e).lower()
response["message_error"] = message
response["result"] = {"code_http": status.HTTP_409_CONFLICT}
response["request_params"] = request.data
finally:
return Response(response, status=status.HTTP_201_CREATED)
and the viewset must reuse the POST method below. The request if from the GER methos, so I can't do that to inject datas with POST method :
@action(detail=True, methods=["POST"])
def write(self, request, departement=None) -> Response:
try:
response = {"result": []}
#params = {"number" : 44}
#zm = ZoneViewSet.as_view({"get": "zm"})(request._request, **params).render().content
params = {
"target": datetime.now().strftime(self.format_date),
"value": 9,
"origin": "auto",
"zm": 12,
}
#post_zm = AccessViewSet.as_view({"post": "add"})(request._request, **params).render().content
post_accesslevel = AccessViewSet() # <-----------
# from the AccessViewet
post_accesslevel.add(request)
except ValueError as e:
response = {"result": {"message_error": status.HTTP_406_NOT_ACCEPTABLE}}
except Exception as e:
response = {"result": {"message_error": status.HTTP_503_SERVICE_UNAVAILABLE}}
finally:
return Response(response)
In the urls.py :
access_level_add = access.AccessViewSet.as_view({"post": "add"})
Can you help me please ?
Thanks F.