I have two forms in one template, but one of them doesn’t have data to my database.
Why does it happen and how to fix it?
When I fill out the Pack form and press “submit” the terminal shows that: “POST” /sklad HTTP/1.1" 200 9937
This data doesn’t save to my database.
When I fill out the Sklad form and press “submit” the terminal shows that: “POST” /sklad HTTP/1.1" 302 0
This data saves to my database fine.
views.py
class SkladCreateView(LoginRequiredMixin, CustomSuccessMessageMixin, CreateView): model = Sklad template_name = 'sklad.html' form_class = SkladForm success_url = reverse_lazy('sklad') success_msg = 'Материал сохранён' def get_context_data(self, **kwargs): kwargs['sklad_form'] = SkladForm kwargs['pack_form'] = PackForm kwargs['list_sklad'] = Sklad.objects.all().order_by('material') kwargs['list_pack'] = Pack.objects.all().order_by('name_pack') return super().get_context_data(**kwargs) def form_valid(self, form): self.object = form.save(commit=False) self.object.author = self.request.user self.object.save() return super().form_valid(form)
models.py
class Sklad(models.Model): author = models.ForeignKey(User, on_delete = models.CASCADE, verbose_name='автор склада', null=True) material = models.CharField('название', max_length=200) unit = models.CharField('единица измерения', max_length=200) description = models.CharField('описание', max_length=200, null=True) price_buy = models.IntegerField('цена закупки', ) price_sell = models.IntegerField('цена продажи', ) amount = models.IntegerField('количество', default='0') def __str__(self): return self.material class Pack(models.Model): author = models.ForeignKey(User, on_delete = models.CASCADE, verbose_name='автор упаковки', null=True) name_pack = models.CharField('название', max_length=100) price_pack = models.IntegerField('цена', ) def __str__(self): return self.name_pack
forms.py
class SkladForm(forms.ModelForm): class Meta: model = Sklad fields = ( 'material', 'unit', 'description', 'price_buy', 'price_sell', 'amount', ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields: self.fields[field].widget.attrs['class'] = 'form-control' class PackForm(forms.ModelForm): class Meta: model = Pack fields = ( 'name_pack', 'price_pack', ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields: self.fields[field].widget.attrs['class'] = 'form-control'