#django #django-models #django-views #django-templates #django-class-based-views
Вопрос:
Я реализовал два представления для отображения данных в соответствии с полями выбора, но у меня есть два представления с несколько иной логикой в представлениях и шаблонах, как мне объединить их в одно, чтобы я позаботился о СУХОМ
views.py:
class View1(LoginRequiredMixin,TemplateView): template_name = 'temp1.html' def get_context_data(self, **kwargs): context = super(View1,self).get_context_data(**kwargs) context['progress'] = self.kwargs.get('progress', 'in_progress') if context['progress'] == 'in_progress': context['objects'] = Model.objects.filter(progress='in_progress') else: context['objects'] = Model.objects.filter(progress__iexact=context['progress'], accepted=self.request.user) return context class View2(LoginRequiredMixin,TemplateView): template_name = 'temp2.html' def get_context_data(self, **kwargs): context = super(View2,self).get_context_data(**kwargs) context['progress'] = self.kwargs.get('progress', 'in_progress') if context['progress'] == 'in_progress': context['objects'] = Model.objects.filter(progress='in_progress',created = self.request.user) else: context['objects'] = Model.objects.filter(progress__iexact=context['progress'], created_by=self.request.user) return context
Комментарии:
1. вы можете создать одно представление и переопределить метод get_context_data для возврата разных наборов запросов, а затем переопределить метод get_template_names для возврата другого шаблона
Ответ №1:
Реализуйте что-то вроде get_queryset
представлений на основе классов.
class BaseView(LoginRequiredMixin,TemplateView): """ requires subclassing to define template_name and update_qs( qs, progress) method """ def get_context_data(self, **kwargs): context = super(View1,self).get_context_data(**kwargs) progress = self.kwargs.get('progress', 'in_progress') if progress == 'in_progress': qs = Model.objects.filter(progress='in_progress') else: qs = Model.objects.filter(progress__iexact=context['progress'] ) qs = self.update_qs( qs, (progress == 'in_progress') ) context['progress'] = progress context['objects'] = qs return context class View1( BaseView): template_name = 'temp1.html' def update_qs( self, qs, in_progress): if in_progress: return qs else: return qs.filter( accepted=self.request.user) class View2( BaseView): template_name = 'temp2.html' def update_qs( self, qs, in_progress): if in_progress: return qs.filter( created = self.request.user) else: return qs.filter( created_by=self.request.user)