Как использовать поле ManyToMany в django со сквозной моделью, отображая его и сохраняя?

Я делаю базовую систему на Django для спа, которая требует, чтобы у меня был инвентарь, массажи, которые используют различные количества продукта в инвентаре, а затем услуга, которая будет комбинацией нескольких массажей. Таким образом, пользователь спа, то есть персонал, сможет создать услугу, выбрать, какие массажи делают эту услугу, и это мгновенно вызовет вычитание этого продукта из инвентаря. Я использовал отношение "многие ко многим" для связи массажей и товаров, а также сквозную модель для сохранения количества использованных товаров. Мой вопрос в том, как лучше всего отобразить это в форме, чтобы сотрудники могли добавлять новые массажи, выбирая множество товаров и их соответствующее количество, которое будет использовано для массажа? И как я могу сохранить все это в БД? Я использую PostgreSQL. Вот как мои модели выглядят сейчас:

class Producto(models.Model):
    
    nombre = models.CharField(max_length=200, blank=False)
    línea = models.CharField(max_length=200, blank=False)

    proveedor = models.CharField(max_length=200, blank=False)
    costo_mxn =  models.DecimalField(blank=False, max_digits=10, decimal_places=2)

    unidad_de_medición_choices = [
        ("g", "g"),
        ("mL", "mL"),
        ("oz", "oz"),
    ]
    
    unidad_de_medición = models.CharField(max_length=20, choices=unidad_de_medición_choices,null=True, blank=True)
    cantidad_actual = models.DecimalField(blank=False, max_digits=10, decimal_places=2)
    cantidad_inicial = models.DecimalField(blank=False, max_digits=10, decimal_places=2)
    cantidad_alerta = models.DecimalField(blank=False, max_digits=10, decimal_places=2)

    fecha_de_registro = models.DateField(blank=True,null=True,default= datetime.today)
    def __str__(self):
            return self.nombre
class Masaje(models.Model):
    nombre = models.CharField(max_length=200, blank=False)
    productos = models.ManyToManyField(Producto, through='CantidadProducto',blank=True)
    costo = models.DecimalField(blank=False, max_digits=10, decimal_places=2)
    duracion = models.DurationField()
    descripcion = models.TextField(
        max_length=500, blank=True, null=True
    )

class CantidadProducto(models.Model):
    masaje = models.ForeignKey(Masaje,on_delete=models.CASCADE)
    producto = models.ForeignKey(Producto,on_delete=models.CASCADE)
    cantidad_usada = models.DecimalField(blank=False, max_digits=10, decimal_places=2)

Теперь я использую простые формы для отображения других частей системы, которые я сделал не такими сложными, например, массажиста, вот так:

class MasajistaForm(ModelForm):
    class Meta:
        model = Masajista
        fields = (
            'nombre',
            'telefono_celular',
            'fecha_de_nacimiento',
        )
        widgets = {
            'nombre': forms.TextInput(attrs={'class':''}),
            'telefono_celular': forms.TextInput(attrs={'class':''}),
            'fecha_de_nacimiento': forms.SelectDateWidget(years=range(1900, 2023),months = MONTHS,attrs={'class':''},empty_label=("Año", "Mes", "Dia"))
  
        }

С результатом типа это

Теперь, я знаю, что это выглядит не очень хорошо, но сейчас проблема не в этом, я бы хотел, чтобы сотрудники могли видеть такую форму, где можно было бы нажать кнопку "плюс" или что-то вроде этого, где появилось бы новое поле выбора с выбором уже зарегистрированных товаров, и поле ввода, которое можно было бы заполнить вручную, а затем сохранить. Каким должен быть путь?

Вернуться на верх