2012-02-09 16 views
6

En mi caso, permito que el usuario cargue una imagen de avatar y use user_id como nombre de archivo, simplemente. Así que habrá 1.jpg, 2.jpg, etc.¿Cómo evitar que Django cambie el nombre del archivo cuando ya existe un archivo con ese nombre?

Sin embargo, si subía un nuevo avatar para una cuenta que ya tiene uno cargado, digamos usuario # 10, el nuevo archivo se nombrará como " 10_1.jpg ". Esto está bien, pero no lo necesito y espero que el nuevo archivo sobrescriba el anterior, también ahorra espacio en el disco.

Busqué y busqué en Google pero no pude encontrar una pista. Esperaba que hubiera una opción para ImageField o FileField pero no está allí.

¡Gracias por la ayuda!

+0

un vistazo aquí: http://stackoverflow.com/questions/8332443/set-djangos-filefield-to-an-existing-file – Jingo

Respuesta

10

Debe definir su propio almacenamiento, heredarlo de FileSystemStorage y anular la función get_available_name en él. El uso de este almacenamiento para su imagen de campo. Algo como esto:

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 hombre. Acabo de encontrar que este es el lugar correcto para comenzar, pero 'get_available_name' no es el método para anular. Anulo '_save' y todo funciona ahora. – x1a0

+0

Así que tienes que copiar 50 líneas de código, lo cual no es realmente bueno. Es por eso que es mejor anular get_available_name –

+0

Consulte esta pregunta http://stackoverflow.com/questions/15885201/django-uploads-discard-uploaded-duplicates-use-existing-file-md5-based-check?answertab=votes# tab-top – jdcaballerov

Cuestiones relacionadas