2011-05-03 93 views
2

我想在我的模型中覆蓋保存方法來創建合適的slug並在其中進行小修改來創建imagefield副本。我該如何處理?Django覆蓋保存

def save(self, *args, **kwargs): 
      super(MyModel, self).save(*args, **kwargs) #to get id 

      #slug 
      self.slug = '%s-%i' % (self.topic, self.id) 

      #create copy of img 
      cp_path = dirname(self.image.path)+'/copies_'+basename(self.image.path) 
      shutil.copy2(self.image.path, cp_path) 

      file = open(cp_path) 
      django_file = File(file) 
      django_file.name = basename(cp_path) #otherwise path will be duplicated 
      self.cp_image = django_file 

      super(MyModel, self).save(*args, **kwargs) #to save my new ImageField 

      create_watermark(self.cp_image, self.topic, self.text, 500, 45) 

原因我使用super(MyModel,self).save()兩次我有一個self.image文件的副本。正如你所看到的,我對django和python不是很熟悉。我該如何做得更好?

回答

1

它可能不是最優雅的方式,但您可以嘗試將save()post_save signal結合使用。大概是這個樣子:

class MyModel(Model): 
    ## Stuff 
    def save(self, *args, **kwargs): 
     #create copy of img. Fixed up to use string formatting. 
     cp_path = "%s/copies_%s" % 
      (dirname(self.image.path), basename(self.image.path)) 
     shutil.copy2(self.image.path, cp_path) 
     file = open(cp_path) 
     django_file = File(file) 
     django_file.name = basename(cp_path) 
     self.cp_image = django_file 
     create_watermark(self.cp_image, self.topic, self.text, 500, 45) 
     super(MyModel, self).save(*args, **kwargs) #to save my new ImageField 

from django.dispatch import receiver 
from django.db.models.signals import post_save 
@receiver(post_save, sender=MyModel) 
def mymodel_slug_handler(sender, instance=None, **kwargs): 
    if instance is not None: 
     new_slug = '%s-%i' % (instance.topic, instance.id) 
     if instance.slug != new_slug: # Stops recursion. 
      instance.slug = new_slug 
      instance.save() 
+0

不幸的是它會導致「沒有這樣的文件或目錄:」錯誤如果我不會用save()方法之前,我嘗試對文件進行操作。 – MilkyWay 2011-05-03 19:54:39

+0

哦,然後將整個保存移動到post_save處理程序。這也可以讓你檢查created = True只做一次。 – 2011-05-03 20:38:34