How to programmatically call a Django Rest Framework view within another view?
I have the following generic class based views built with Django Rest framework (DRF)
class ExampleDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Example.objects.all()
serializer_class = ExampleSerializer
renderer_classes = (JSONRenderer, TemplateHTMLRenderer)
def get(self, request, *args, **kwargs):
response = self.retrieve(request, *args, **kwargs)
if request.accepted_renderer.format == 'html':
form = ExampleForm(data=response.data)
return Response({'data': response.data, 'form': form}, template_name='example.html')
return response
This view allow me to obtain both JSON data or HTML form from the same endpoint by specifying the format=json or html.
I would like to programmatically call that view to obtain the rendered HTML form from within another view in order to include this form in another page that will include more stuff.
Solution 1:
I found the solution for this in the documentation... https://docs.djangoproject.com/en/1.7/topics/class-based-views/mixins/
Hint is from their example here:
class AuthorDetail(View):
def get(self, request, *args, **kwargs):
view = AuthorDisplay.as_view()
return view(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
view = AuthorInterest.as_view()
return view(request, *args, **kwargs)
Solution 2:
html_from_view = ExampleDetail.as_view({'get': 'list'})(request).content
OR
html_from_view = ExampleDetail.as_view({'get': 'retrieve'})(request, pk=my_id).render().content
Solution 3:
As of Django 2.2 and DRF 3.9.2 I am able to get response using below code.
response = UserItemsApiView.as_view()(request=request._request).data
Above example solves below issues:
- The
request
argument must be an instance ofdjango.http.HttpRequest
, notrest_framework.request.Request
- Instead of
content
, usingdata
attribute gave me result from that view.