Во-первых, я думаю, что вы имели в виду self.slug
, а не Category.slug
. self.slug
- это значение поля slug для данного конкретного экземпляра , в то время как Category.slug
- просто экземпляр класса SlugField
.
Вам следует переопределить save
вашей модели. метод для вызова create_directory
:
class Category(models.Model):
...
def create_directory(self):
gallery_path = os.path.abspath(
os.path.join(settings.MEDIA_ROOT, self.slug))
if not os.path.isdir(gallery_path):
os.mkdir(gallery_path)
def save(self, *args, **kwargs):
if not self.pk:
self.create_directory()
super().save(*args, **kwargs)
В качестве альтернативы вы можете создать сигнал для этого:
models.py:
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Category)
def category_post_save(sender, instance, *args, **kwargs):
gallery_path = os.path.abspath(
os.path.join(settings.MEDIA_ROOT, instance.slug))
if not os.path.isdir(gallery_path):
os.mkdir(gallery_path)
Обновление
Если вы также хотите удалить каталог, вы можете переопределить метод delete
:
class Category(models.Model):
...
def delete(self, *args, **kwargs):
os.rmdir(os.path.join(settings.MEDIA_ROOT, self.slug))
super().delete(*args, **kwargs)
Также имеется сигнал pre_delete
что вы можете использовать.