es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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
Tags:  , , , ,

Answer

  1. Avatar for 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:

    class BaseView(LoginRequiredMixin, TemplateView):
        progress_field = 'progreso'
        progress_value = 'en_progreso'
        template_name = None
        model = None
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            progress = self.kwargs.get(self.progress_field, self.progress_value)
            if progress == self.progress_value:
                context['objects'] = self.model.objects.filter(progress=self.progress_value)
            else:
                context['objects'] = self.model.objects.filter(progress__iexact=progress, accepted=self.request.user)
            return context
    
    class View1(BaseView):
        template_name = 'temp1.html'
        model = Modelo
    
    class View2(BaseView):
        template_name = 'temp2.html'
        progress_field = 'estado'
        progress_value = 'en_progreso'
        model = Modelo
    

    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.

Comments are closed.