Предотвращение повторения кода в методах 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, вы сможете убрать атрибут имени шаблона.
Кстати: если у вас только один продукт, почему вы назвали его "продукты"?