Страница Django DetailView - встроенный набор форм не сохраняется в SQL

Я пытаюсь реализовать Django inline formset в DetailView. Согласно документации гораздо лучше разделить представления Detail и Form и свести их вместе в третьем представлении, что я и сделал. Моя форма видна в файле шаблона, но после отправки ничего не происходит. Она корректно возвращается в представление подробной информации о продукте, но никакие данные не сохраняются в SQL.

Можете, пожалуйста, сообщить мне, что я делаю неправильно?

models.py

class Product(models.Model):
    title = models.CharField('title', max_length=400, blank=False, null=False, help_text='max 400 characters', default='')

class CERequest(models.Model):
    author = models.CharField(max_length=255, blank=True, null=True)
    related_component = models.ForeignKey(CostCalculator, on_delete=models.CASCADE, blank=True, null=True, default=1)
    number_of_units = models.IntegerField(default=0)
    related_product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True, blank=True, related_name='related_product_ce_request')
    created = models.DateTimeField(default=timezone.now)
    total_price = models.IntegerField(verbose_name='Price (€)', default=0, blank=True, null=True)

forms.py

class CalculatorFormProduct(forms.ModelForm):
    author = forms.CharField(widget = forms.HiddenInput(), required = False)
    number_of_units = forms.IntegerField(help_text='Only numeric values are allowed.', min_value=0)
    total_price = forms.IntegerField(widget = forms.HiddenInput(), required = False)
    created = forms.DateTimeField(widget = forms.HiddenInput(), required = False)
  
    
    class Meta: 
        model = CERequest
        fields = ('author', 'created', 'related_product', 'related_component', 'number_of_units')


CalculatorFormsetProduct = inlineformset_factory(Product, CERequest, form=CalculatorFormProduct, fields=('author', 'related_product', 'related_component', 'created', 'number_of_units'), extra=3, can_delete=False)

views.py

class ProductView(LoginRequiredMixin, DetailView):
    model = Product
    template_name = 'ProductDetailView.html'

    def get_success_url(self):
        return reverse('product', kwargs={'slug': self.kwargs['slug']})

    def get_context_data(self, **kwargs):
            context = super(ProductView, self).get_context_data(**kwargs)
            count_components = CostCalculator.objects.filter(related_product__slug=self.kwargs['slug']).count()
            
            if self.request.POST:
                    
                context['ce_formset'] = CalculatorFormsetProduct(self.request.POST, instance=self.object, initial=[{
                    'author': self.request.user.email,
                    'created': timezone.now,
                    } for x in range(count_components)])
            else:
                context['ce_formset'] = CalculatorFormsetProduct(instance=self.object, initial=[{
                    'author': self.request.user.email,
                    'created': timezone.now,
                    } for x in range(count_components)])
                
            return context


class ProductFormView(SingleObjectMixin, FormView):
    template_name = 'ProductDetailView.html'
    form_class = CalculatorFormsetProduct
    model = Product

    def post(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return HttpResponseForbidden()
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)


class ProductDetailView(View):
    def get(self, request, *args, **kwargs):
        view = ProductView.as_view()
        return view(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        view = ProductFormView.as_view()
        return view(request, *args, **kwargs)

urls.py

urlpatterns = [
    path('hubble/product/<slug:slug>/', views.ProductDetailView.as_view(), name='product'),
]
Вернуться на верх