2014-11-06 22 views
25

ho le seguenti viste basato classe generica costruite con quadro Django turismo (DRF)Come chiamare a livello di programmazione una vista di Django Rest Framework all'interno di un'altra vista?

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 

Questo punto di vista mi permettono di ottenere sia i dati JSON o modulo HTML dallo stesso endpoint specificando il format = JSON o HTML.

Vorrei chiamare a livello di programmazione questa vista per ottenere il modulo HTML reso da un'altra vista al fine di includere questo modulo in un'altra pagina che includerà più elementi.

risposta

16
html_from_view = ExampleDetail.as_view({'get': 'list'})(request).content 

O

html_from_view = ExampleDetail.as_view({'get': 'retrieve'})(request, pk=my_id).render().content 
+0

qual è la richiesta? e se sono in una shell ipython –

23

ho trovato la soluzione per questo nella documentazione ... https://docs.djangoproject.com/en/1.7/topics/class-based-views/mixins/

suggerimento è dal loro esempio qui:

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) 
-3

Se ho la comprensione correttamente, è necessario per ottenere il risultato dal punto di vista B, mentre all'interno vista A.

Utilizzando le richieste /urllib2 e jSON librerie dovrebbero risolvere il tuo problema (come specificato in this answer).

Per ottenere l'URL, è possibile utilizzare una combinazione di request.get_absolute_uri() e/o request.get_host() e django.core.urlresolvers.reverse.

Problemi correlati