There are 2 models CPU and GalleryCPU (see models.py below), they are interconnected by a one-to-many relationship. I did this in order to make it possible to add several pictures. That is, I connected 2 models with one-to-many communication and added inline editing (see screenshot below).
models.py
class CPU(models.Model): category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='Категория') slug = models.SlugField() manufacturer = models.CharField(max_length=5, choices=CHOISE_MANUFACTURER, verbose_name='Производитель') series = models.ForeignKey(SeriesCPU, on_delete=models.CASCADE, verbose_name='Серия') socket = models.ForeignKey(Socket, on_delete=models.CASCADE, verbose_name='Сокет') model = models.CharField(max_length=15, verbose_name='Модель') core = models.ForeignKey(Core, on_delete=models.CASCADE, verbose_name='Ядро') count_core = models.SmallIntegerField(verbose_name='Количество ядер') count_stream = models.SmallIntegerField(verbose_name='Количество потоков') normal_frequency = models.SmallIntegerField(verbose_name='Тактовая частота') turbo_frequency = models.SmallIntegerField(verbose_name='Частота в режиме Turbo') unlocked_multiplier = models.BooleanField(default=False, verbose_name='Разблокированный множитель') cash_size_L1 = models.SmallIntegerField(verbose_name='Объем кэша L1') cash_size_L2 = models.SmallIntegerField(verbose_name='Объем кэша L2') cash_size_L3 = models.SmallIntegerField(blank=True, null=True, verbose_name='Объем кэша L3') integrated_graphics_core = models.CharField(max_length=25, default='нет', verbose_name='Интегрированное графическое ядро') frequency_graphics_core = models.SmallIntegerField(blank=True, null=True, verbose_name='Частота') technologic_process = models.SmallIntegerField(verbose_name='Технологический процесс') heat_dissipation = models.SmallIntegerField(verbose_name='Тепловыделение') technology = models.ManyToManyField(TechnologyCPU, verbose_name='Технологии') CHOISE_TYPE_DELIVERY = ( ('box', 'BOX'), ('oem', 'OEM'), ) type_delievery = models.CharField(max_length=3, choices=CHOISE_TYPE_DELIVERY, verbose_name='Тип поставки') guarantee = models.SmallIntegerField(verbose_name='Гарантия') count = models.SmallIntegerField(verbose_name='Количество') price = models.BigIntegerField(verbose_name='Цена') class Meta: verbose_name_plural = "Процессоры" verbose_name = 'Процессор' unique_together = ('series', 'model', 'type_delievery') class GalleryCPU(models.Model): image = models.ImageField(upload_to='img\CPU', verbose_name='Изображение процессора') cpu = models.ForeignKey(CPU, on_delete=models.CASCADE, related_name='images', verbose_name='Процессор') class Meta: verbose_name_plural = "Изображения процессоров" verbose_name = "Изображение процессора"
I would like that when adding images for a specific CPU, a folder with the name of this CPU is created and all the images are loaded into this folder. For example, I add a CPU named Ryzen 5 1600, and when I add pictures for this CPU, I create a folder named Ryzen 5 1600 and all the pictures are loaded into this folder.
There is an idea to do the following in the CPU model, there is a slug field, based on this, you can implement the following method:
def image_folder(instance, filename): filename = instance.slug + '.' + filename.split('.')[1] return "{0}/{1}".format(instance.slug, filename) The method above automatically creates a folder named slug and uploads a picture there. However, it is suitable only when both the Slug type field and the ImageField type are in the same model, that is, the CPU model. But I repeat once again, they are in my different models, and this was done in order to be able to add several pictures. The question is how to automatically create a folder for CPU images with the name of this CPU?