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?
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