Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Django et signal

+3 votes

J'utilise ce model :

from django.db import models
from django.db.models.signals import pre_delete
from django.dispatch.dispatcher import receiver


def content_file_name(instance, filename):
    return '/'.join(['static/media', filename])

# Create your models here.
class Document(models.Model):
    titre = models.CharField(max_length=200)
    slug = models.SlugField(null=False, blank=False, unique=True)
    image = models.ImageField(upload_to=content_file_name,blank=True)
    pub_date = models.DateTimeField('date published')
    contenu = models.TextField()

    def __str__(self):
        return self.titre



@receiver(pre_delete, sender=Document)
def even_delete(sender, instance, **kwargs):
    # Pass false so FileField doesn't save the model.
    instance.image.delete(False)  

Mon decorateur supprimant mes images fonctionne bien lors d'un delete.
Est-il possible de faire la même chose pour un update, c'est à dire la suppression de l'ancienne image.

demandé 9-Mar-2015 par Mortim3r

1 Réponse

+3 votes
 
Meilleure réponse

Sans decorateur, et en redefinissant la methode save, un truc du genre devrait faire l'affaire:

class Document(models.Model):
    def save(self, *args, **kwargs):
        try:
            current = Document.objects.get(id=self.id)
            if current.image != self.image:
                current.image.delete(False)
        except: pass
        super(Document, self).save(*args, **kwargs)
répondu 9-Mar-2015 par Nsukami_ (1,998 points)

Avec un décorateur, ca passe en faisant :

@receiver(pre_save, sender=Document)
def even_save(sender, instance, **kwargs):
    try:
        this = Document.objects.get(id=instance.id)
        if this.image != instance.image:
            this.image.delete()
    except: pass

Surement à améliorer, mais c'est un bon début, merci

...