2012-02-09 14 views
6

Nel mio caso consento all'utente di caricare un'immagine avatar e utilizzare user_id come nome file, semplicemente. Quindi ci saranno 1.jpg, 2.jpg, ecc.Come impedire a Django di cambiare il nome del file quando esiste già un file con quel nome?

Tuttavia ho trovato se caricavo un nuovo avatar per un account che ne ha già uno caricato, diciamo utente # 10, il nuovo file sarà denominato come " 10_1.jpg". Va bene, comunque non ne ho bisogno e spero che il nuovo file possa sovrascrivere quello vecchio - salva comunque dello spazio su disco.

Ho cercato su Google e cercato ma non ho trovato alcun indizio. Speravo ci sarebbe stata un'opzione per ImageField o FileField ma non è lì.

Grazie per l'aiuto!

+0

Date un'occhiata qui: http://stackoverflow.com/questions/8332443/set-djangos-filefield-to-an-existing-file – Jingo

risposta

10

È necessario definire il proprio archivio, ereditarlo da FileSystemStorage e sostituire la funzione get_available_name al suo interno. Usa questa memoria per il tuo imagefield. Qualcosa di simile a questo:

class OverwriteStorage(FileSystemStorage): 

    def get_available_name(self, name): 
     if self.exists(name): 
      os.remove(os.path.join(SOME_PATH, name)) 
     return name 

fs = OverwriteStorage(location=SOME_PATH) 

class YourModel(models.Model): 
    image_file = models.ImageField(storage=fs) 
+0

Hey man. Ho appena trovato che questo è il posto giusto per iniziare, tuttavia 'get_available_name' non è il metodo per sovrascrivere. Sovrascrivo '_save' e tutto funziona ora. – x1a0

+0

Quindi devi copiare 50 righe di codice, il che non è molto buono. Ecco perché è meglio ignorare get_available_name –

+0

Fare riferimento a questa domanda http://stackoverflow.com/questions/15885201/django-uploads-discard-uploaded-duplicates-use-existing-file-md5-based-check?answertab=votes# tab-top – jdcaballerov

Problemi correlati