2016-09-19 2 views
3

ich ein Verfahren ähnlich dem, das Giles vorgeschlagen für das Speichern von neuen Bildern mit einem Dateinamen des Primärschlüssels des Modells gerade hier erfolgreich implementiert haben: https://stackoverflow.com/a/16574947/5884437Wie vorhandene Datei zu löschen, wenn Börse eine neue

Actual Kode:

class Asset(models.Model): 
    asset_id = models.AutoField(primary_key=True) 
    asset_image = models.ImageField(upload_to = 'images/temp', max_length=255, null=True, blank=True) 

    def save(self, *args, **kwargs): 
     # Call save first, to create a primary key 
     super(Asset, self).save(*args, **kwargs) 

     asset_image = self.asset_image 
     if asset_image: 
      # Create new filename, using primary key and file extension 
      oldfile = self.asset_image.name 
      dot = oldfile.rfind('.') 
      newfile = 'images/' + str(self.pk) + oldfile[dot:] 

      # Create new file and remove old one 
      if newfile != oldfile: 
       self.asset_image.storage.delete(newfile) 
       self.asset_image.storage.save(newfile, asset_image) 
       self.asset_image.name = newfile 
       self.asset_image.close() 
       self.asset_image.storage.delete(oldfile) 

     # Save again to keep changes 
     super(Asset, self).save(*args, **kwargs) 

    def __str__(self): 
     return self.asset_description 

zB Der Benutzer sendet "MyPicture.jpg" auf ein leeres Formular "Neues Asset". Der Server speichert das neue Asset zuerst, um einen Primärschlüssel (asset_id) zu generieren, benennt die Datei dann als [asset_id] [original_extension] (z. B. "26.jpg") um und verschiebt sie in den richtigen Ordner.

Leider habe ich gerade festgestellt, dass dies nicht berücksichtigt Dateien mit verschiedenen Erweiterungen, z. ein Benutzer lädt zuerst ein Bild hoch, das in "26.jpg" umbenannt wird, aber dann, wenn ein Benutzer ein neues Bild für dieses Objekt mit einer anderen Erweiterung (z. B. ".png") hochlädt, werden beide "26.jpg" & "26.png "wird zusammen gespeichert werden.

Wie kann ich dies ändern, so dass ein vorhandenes Bild immer gelöscht wird, wenn ein neues Bild für diesen Asset/Primärschlüssel hochgeladen wird?

Antwort

2

Sie können versuchen, das alte Bild zu löschen, wenn es das Bild neu sumbitted doens't entsprechen:

class Asset(models.Model): 
    asset_id = models.AutoField(primary_key=True) 
    asset_image = models.ImageField(upload_to = 'images/temp', max_length=255, null=True, blank=True) 

    def save(self, *args, **kwargs): 
     # Delete the old image 
     try: 
      asset = Asset.objects.get(id=self.id) 
      if asset.asset_image and self.image and asset.asset_image != self.image: 
       # Delete the old file if it doesn't match the newly submitted one 
       asset.asset_image.delete(save=False); 
     except Asset.DoesNotExist: 
      # Do nothing when a new image is submitted 
      pass 
     # Call save first, to create a primary key 
     super(Asset, self).save(*args, **kwargs) 
     ... 

Eine bessere Lösung könnte sein, einen Blick auf django-cleanup zu nehmen, die automatisch Dateien für Filefield, löscht und Imagefield Unterklassen. Es löscht die alte Datei beim Löschen des Modells oder wenn eine neue Datei aktualisiert wird.

+0

Nur für die Lernerfahrung war ich versucht, auf der Grundlage Ihrer vorgeschlagenen Code "meine eigenen rollen", aber ich habe gerade versucht Django-Aufräumen und es funktioniert so gut out-of-the-Box, die ich gerade gehe dabei bleiben! Danke für den Vorschlag! – TimJ

Verwandte Themen