Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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

...