Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/11/2014, 15:30
Avatar de kojicomics
kojicomics
 
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 10 años, 10 meses
Puntos: 1
Renderizar dos vistas en el mismo template

Tengo dos vistas basadas en clase y me gustaría renderizar el resultado de ambas en la misma plantilla html

Estas son las clases:
Código Python:
Ver original
  1. class ListPosts(ListView):
  2.     '''Blogs posts'''
  3.     context_object_name = 'posts'
  4.     template_name = 'index/index.html'
  5.     paginate_by = 3
  6.  
  7.     def get_queryset(self):
  8.         lang_pk = Language.objects.filter(locale=self.request.LANGUAGE_CODE)
  9.         posts = Post.objects.filter(status='p')
  10.         posts_translated = PostTranslation.objects.filter(
  11.             post=posts,
  12.             language=lang_pk
  13.             )
  14.         return posts_translated
  15.  
  16.  
  17. class ListWorks(ListView):
  18.     '''Portfolio works'''
  19.     context_object_name = 'works'
  20.     template_name = 'index/index.html'
  21.     paginate_by = 3
  22.  
  23.     def get_queryset(self):
  24.         lang_pk = Language.objects.filter(locale=self.request.LANGUAGE_CODE)
  25.         works = Work.objects.filter(status='p')
  26.         works_translated = WorkTranslation.objects.filter(
  27.             work=works,
  28.             language=lang_pk
  29.             )
  30.         return works_translated

He probado a crear una tercera clase que retorne ambas querysets, pero no he logrado que funcione. Una de las formas que probé es esta:

Código Python:
Ver original
  1. class ListAll(TemplateView, ListPosts, ListWorks):
  2.     template_name = 'index/index.html'
  3.  
  4.     def get_context_data(self, **kwargs):
  5.         context = super(ListAll, self).get_context_data(**kwargs)
  6.         posts = ListPosts.get_queryset()
  7.         works = ListWorks.get_queryset()
  8.         if posts:
  9.             context['posts'] = posts
  10.         if works:
  11.             context['works'] = works
  12.         return context

En este caso, la aplicación me da el siguiente error:
Código:
'ListAll' object has no attribute 'object_list'
Mediante una única clase me funciona correctamente, pero me gustaría saber como hacerlo funcionar con clases independientes por simple curiosidad

De esta forma es como me funciona:
Código Python:
Ver original
  1. class ListAll(TemplateView):
  2.     template_name = 'index/index.html'
  3.  
  4.     def get_context_data(self, **kwargs):
  5.         context = super(ListAll, self).get_context_data(**kwargs)
  6.         lang_pk = Language.objects.filter(locale=self.request.LANGUAGE_CODE)
  7.         posts = Post.objects.filter(status='p')
  8.         works = Work.objects.filter(status='p')
  9.         context['posts'] = PostTranslation.objects.filter(
  10.             post=posts,
  11.             language=lang_pk
  12.             )[:3]
  13.         context['works'] = WorkTranslation.objects.filter(
  14.             work=works,
  15.             language=lang_pk
  16.             )[:3]
  17.         return context

Saludos