Предотвращение повторения кода в методах get и post в django class vase view

В методе get есть несколько строк кода, которые также используются в методе post. Как я могу предотвратить повторение кода в этом представлении?

class ProductDetail(View):
    def get(self, request, *args, **kwargs):
        products = Product.objects.get(id=self.kwargs['pk'])
        related_products = products.tags.similar_objects()[:4]
        comments = Comment.objects.filter(is_reply=False, product_id=self.kwargs['pk'])
        change = Chart.objects.filter(product_id=self.kwargs['pk'])

        context = (
            {'products': products, 'related_products': related_products, 'comments': comments, 
             'change': change})
        return render(request, 'home/details.html', context)

    def post(self, request, *args, **kwargs):
        products = Product.objects.get(id=self.kwargs['pk'])
        related_products = products.tags.similar_objects()[:4]
        comments = Comment.objects.filter(is_reply=False, product_id=self.kwargs['pk'])
        change = Chart.objects.filter(product_id=self.kwargs['pk'])
        
        context = ({'products': products, 'related_products': related_products, 'comments': comments, 
                    'change': change})
        return render(request, 'home/details.html', context)

Работает ли это?

class ProductDetail(View):
    def dostuff(id):
        self.products = Product.objects.get(id)
        self.related_products = self.products.tags.similar_objects()[:4]
        self.comments = Comment.objects.filter(is_reply=False, product_id=id)
        self.change = Chart.objects.filter(product_id=id)        

    def get(self, request, *args, **kwargs):
        dostuff(self.kwargs['pk'])
        context = (
            {'products': self.products, 'related_products': self.related_products, 'comments': self.comments, 
             'change': self.change})
        return render(request, 'home/details.html', context)

    def post(self, request, *args, **kwargs):
        dostuff(self.kwargs['pk'])
        context = ({'products': self.products, 'related_products': self.related_products, 'comments': self.comments, 
                    'change': self.change})
        return render(request, 'home/details.html', context)

Вы можете просто использовать DetailView из DGCBV.

class ProductDetail(DetailView):
    model = Product
    template_name = 'home/details.html'

    def post(self, request, *args, **kwargs):
        return self.get(request, *args, **kwargs)

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        obj = context['products'] = context['product']
        context['related_products'] = obj.tags.similar_objects()[:4]
        context['comments'] = Comment.objects.filter(is_reply=False, produc=obj)
        context['change'] = Chart.objects.filter(product=obj)
        return context

если вы переименуете свой шаблон в product_detail.html, вы сможете убрать атрибут имени шаблона.

Кстати: если у вас только один продукт, почему вы назвали его "продукты"?

Вернуться на верх