2014-11-01 101 views
0

我想優化此代碼。我認爲最好的解決方案是使用pre_save方法,而不是覆蓋保存方法。
這是刪除舊的圖像的功能時,在編輯上傳新的圖片優化Django代碼模型

def delete_old_image(sender, instance): 
    try: 
     obj = sender.objects.get(id=instance.id) 
    except sender.DoesNotExist: 
     pass 
    else: 
     if not obj.image == instance.image:    
      try: 
       os.remove(obj.image.path) 
      except: 
       pass 


模型

class Service(models.Model): 
    title= models.CharField(max_length=170) 
    slug = models.SlugField(max_length=200, blank=True, unique=True, editable=False) 
    def save(self, *args, **kwargs): 
     self.slug = slugify(self.title) 
     super(Service, self).save(*args, **kwargs)   

class Portfoglio(models.Model): 
    title= models.CharField(max_length=170, unique=True) 
    slug = models.SlugField(max_length=200, blank=True, unique=True, editable=False) 
    image=models.ImageField(upload_to = 'images/' , default= 'images/foto.jpg', verbose_name='upload') 
    def save(self, *args, **kwargs): 
     self.slug = slugify(self.title) 
     if self.id is not None: 
      delete_old_image(Portfoglio, self) 
     super(Portfoglio, self).save(*args, **kwargs) 

class Image(models.Model): 
    title= models.CharField(max_length=200) 
    image=models.ImageField(upload_to = 'images/' , default= 'images/foto.jpg', verbose_name='upload') 
    def save(self, *args, **kwargs):   
     if self.id is not None: 
      delete_old_image(Portfoglio, self) 
     super(Image, self).save(*args, **kwargs)   

class Team(models.Model): 
    name= models.CharField(max_length=200) 
    image= models.ImageField(upload_to = 'images/' , default= 'images/foto.jpg', verbose_name='upload')   
    def save(self, *args, **kwargs):   
     if self.id is not None: 
      delete_old_image(Team, self) 
     super(Team, self).save(*args, **kwargs) 

回答

0
from django.db.models.signals import pre_save 
from django.dispatch import receiver 

@receiver(pre_save) 
def pre_delete_old_image(sender, instance, created, **kwargs): 
    if sender not in [Service, Portfoglio, Image, Team]: 
     return 
    if getattr(sender, 'slug', False): 
     instance.slug = slugify(instance.title) 
    if not created and getattr(sender, 'image', False): 
     delete_old_image(sender, instance) 


def delete_old_image(sender, instance): 
    try: 
     obj = sender.objects.get(id=instance.id) 
    except sender.DoesNotExist: 
     pass 
    else: 
     if obj.image != instance.image:    
      try: 
       os.remove(obj.image.path) 
      except Exception as e: 
       pass 
+0

感謝..的代碼這段代碼是完美的下.. – 2014-11-02 08:42:31

+0

所以接受回答:) http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow – madzohan 2014-11-02 10:30:18

+0

剛剛完成!非常感謝你 – 2014-11-02 20:00:31