Django динамически формирует
У меня есть следующее Мои модели:
# База товаров / Base products
class Products(models.Model):
name = models.CharField(max_length=150, verbose_name='Название')
def __str__(self):
return self.name
class Meta:
ordering = ('name',)
verbose_name = 'База товаров'
verbose_name_plural = 'База товаров'
# Закупили / Base purchases
class Purchases_item(models.Model):
product = models.ForeignKey(Products, on_delete=models.CASCADE, verbose_name='Товар')
quantity = models.PositiveIntegerField(default=0, verbose_name='Кол-во')
untils = models.ForeignKey(Untils, on_delete=models.CASCADE, verbose_name='Ед. измерения')
price = models.DecimalField(max_digits=150, default=0, decimal_places=0, verbose_name='Цена себестоимости')
total_price = models.DecimalField(max_digits=150, default=0, decimal_places=0, verbose_name='Общая сумма')
def __str__(self):
return str(self.product)
def save(self, *args, **kwargs):
super(Purchases_item, self).save(*args, **kwargs)
val = self.price * self.quantity
if self.total_price != val:
self.total_price = self.price * self.quantity
self.save()
class Meta:
ordering = ('product', 'price', 'total_price')
verbose_name = 'Покупка по позициям'
verbose_name_plural = 'Покупки по позициям'
# Список который мы закупили записываем на склад / Purchases List
# По факту это склад списком
class Purchases(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
date = models.DateField(auto_now_add=True, verbose_name='Дата') # переделать на defaul и отключить auto now add
company = models.CharField(max_length=150, verbose_name='Компания', null=True, blank=True, default=None)
product = models.ManyToManyField(Purchases_item, verbose_name='Товар(ы)')
total_price = models.DecimalField(max_digits=150, decimal_places=0, verbose_name='Общая сумма', default=0)
def __str__(self):
return self.company
def save(self, *args, **kwargs):
super(Purchases, self).save(*args, **kwargs)
if self.total_price != sum(product.total_price for product in self.product.all()):
self.total_price = sum(product.total_price for product in self.product.all())
self.save()
class Meta:
ordering = ('date', 'company', 'total_price')
verbose_name = 'Покупка список'
verbose_name_plural = 'Покупки список'
Мои формы:
class ProductForm(ModelForm):
class Meta:
model = Products
fields = ['name', 'category']
class PurchasesForm(ModelForm):
class Meta:
model = Purchases
fields = ['user', 'company']
widgets = {
'user': Select(attrs={
'class': "form-select",
'placeholder': 'Название товара'
}),
'company': TextInput(attrs={
'class': "form-select",
'placeholder': 'Поставщик'
}),
}
class PurchasesItemForm(ModelForm):
class Meta:
model = Purchases_item
fields = ['product', 'quantity', 'untils', 'price']
widgets = {
'product': Select(attrs={
'class': "form-select",
'placeholder': 'Название товара'
}),
'quantity': NumberInput(attrs={
'class': "form-control",
'placeholder': 'Кол-во'
}),
'untils': Select(attrs={
'class': "form-select",
'placeholder': 'Ед. измерения'
}),
}
PurchasesItemFormSet = modelformset_factory(
Purchases_item,
fields = ("product", "quantity", "untils", "price", "total_price"),
widgets= {
'product': Select(attrs={
'class': "form-control form-select",
'placeholder': 'Название товара'
}),
'quantity': NumberInput(attrs={
'class': "form-control",
'placeholder': 'Кол-во'
}),
'untils': Select(attrs={
'class': "form-select",
'placeholder': 'Ед. измерения'
}),
'price': NumberInput(attrs={
'class': "form-control",
'placeholder': 'Кол-во'
}),
'total_price': NumberInput(attrs={
'class': "form-control",
'placeholder': 'Кол-во'
}),
},
extra = 1
)
Мое мнение:
# Создать закупку
class PurchasesCreate(View):
model = Purchases
context = {}
def get(self, request, *args, **kwargs):
self.context['form'] = PurchasesForm()
self.context['formset'] = PurchasesItemFormSet(queryset = Purchases_item.objects.none())
# self.context['product'] = Products.objects.all()
# self.context['purchases_item'] = Purchases_item.objects.all()
if self.request.user.is_authenticated == False:
return redirect('login')
else:
return render(request, 'erp/purchases_create.html', self.context)
def post(self, request, pk, *args, **kwargs):
formset = PurchasesItemFormSet(data = self.request.POST)
if formset.is_valid():
formset.save()
return redirect('/')
self.context['user'] = Purchases.objects.get(id=pk)
if self.request.user.is_authenticated == False:
return redirect('login')
else:
return render(request, 'erp/purchases_create.html', self.context)
Суть проблемы в том, что у меня в модели Purchases есть "Many to many", строка "Row", и мне нужно, чтобы все это сохранялось и было динамическим, чтобы я мог выбрать
Пример на фото
Как сделать его динамическим и сохранить полученные данные в моделях "покупки" и "покупки товаров"?