Django覆盖保存
我想在我的模型中覆盖save方法,以创建适当的slug并创建imagefield的副本,只需对其进行一些小的修改。我该怎么处理呢Django覆盖保存,django,model,save,Django,Model,Save,我想在我的模型中覆盖save方法,以创建适当的slug并创建imagefield的副本,只需对其进行一些小的修改。我该怎么处理呢 def save(self, *args, **kwargs): super(MyModel, self).save(*args, **kwargs) #to get id #slug self.slug = '%s-%i' % (self.topic, self.id)
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不是很熟悉。如何才能做得更好?这可能不是最简单的方法,但您可以尝试将
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()
不幸的是,如果我在尝试对文件进行操作之前不使用save()方法,则会导致“无此类文件或目录:”错误。哦,然后将整个保存移动到post_save处理程序。这还允许您检查created=True,以便只执行一次。