Страница 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'),
]