Джанго перезаписать сохранить - PullRequest
2 голосов
/ 03 мая 2011

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

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 Ответ

1 голос
/ 03 мая 2011

Возможно, это не самый простой способ, но вы можете попробовать объединить save() с сигналом post_save .Вероятно, выглядит примерно так:

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()
...