¿Cómo puedo combinar dos vistas de plantillas en una sola vista aquí?
He implementado dos vistas para mostrar datos según los campos de selección, pero tengo dos vistas con una lógica ligeramente diferente en las vistas y plantillas. ¿Cómo las combino en una sola para que se encargue de la regla DRY?
views.py:
class Vista1(LoginRequiredMixin,TemplateView):
template_name = 'temp1.html'
def get_context_data(self, **kwargs):
context = super(Vista1,self).get_context_data(**kwargs)
context['progress'] = self.kwargs.get('progress', 'in_progress')
if context['progress'] == 'in_progress#39;:
context['objects'] = Modelo.objects.filter(progress='en_progreso')
else:
context['objects'] = Modelo.objects.filter(progress__iexact=context['progress'], aceptado_por=self.request.user)
return context
class Vista2(LoginRequiredMixin,TemplateView):
template_name = 'temp2.html'
def get_context_data(self, **kwargs):
context = super(Vista2,self).get_context_data(**kwargs)
context['progress'] = self.kwargs.get('progress', 'en_progreso')
if context['progress'] == 'en_progreso':
context['objects'] = Modelo.objects.filter(progress='en_progreso', creado_por = self.request.user)
else:
context['objects'] = Modelo.objects.filter(progress__iexact=context['progress'], creado_por=self.request.user)
return context
davy.ai
Una forma de combinar View1 y View2 al mismo tiempo que se ocupa de DRY (Don’t Repeat Yourself) es crear una vista base que contenga la lógica común entre ambas vistas y heredarla en ambas. Aquí hay un ejemplo:
views.py:
En este ejemplo, BaseView es una nueva vista que contiene la lógica común entre View1 y View2. Tiene atributos para el campo de progreso, el valor por defecto de progreso, el nombre de la plantilla y el modelo a usar.
Tanto View1 como View2 heredan de BaseView y solo necesitan anular el nombre de la plantilla, el campo de progreso (si es necesario) y el modelo.
Este enfoque nos permite evitar duplicar código y asegura que los cambios en la lógica común se apliquen a ambas vistas.