2011-02-04 29 views
6

Tengo un almacenamiento personalizadaDjango personalizado sistema de almacenamiento de archivos

import os 
from django.core.files.storage import Storage 


class AlwaysOverwriteFileSystemStorage(Storage): 
    def get_available_name(self, name): 
     """ 
     Directly Returns a filename that's 
     from what user input. 
     """ 
     if self.exists(name): 
    # Remove the existing file 
     os.remove(name) 
    # Return the input name as output 
     return name 

Quiero saber dónde debería poner su archivo AlwaysOverwriteFileSystemStorage.py y cómo debería por settings.py definir DEFAULT_FILE_STORAGE

Mi carpeta raíz Django es /home/usuario/webapp

Cuando pongo DEFAULT_FILE_STORAGE = 'site.storage.AlwaysOverwriteFileSystemStorage', devuelve un

error

Error al importar site.storage módulo de almacenamiento: "No hay ningún módulo de almacenamiento llamado"

No estoy familiarizado con Python/Django, cualquier ayuda será muy apreciada. Gracias.

+0

Basado en su camino, parece que el proyecto se denomina "sitio" y hay un directorio dentro llamado "almacenamiento". Asegúrese de que haya un archivo __init__.py en blanco dentro de "almacenamiento". –

+0

@AbidA \ __ init \ __. Py – amertkara

Respuesta

12

No necesita poner nada en su settings.py. Solo úsalo directamente en tu modelo. Por ejemplo, cree storage.py donde sea que se encuentre su aplicación y ponga OverwriteStorage() en ella. Entonces, su modelo podría verse así:

from storage import OverwriteStorage 
... 
class MyModel(models.Model): 
    ... 
    image = ImageField(upload_to='images', storage=OverwriteStorage()) 

También estoy usando un sistema de almacenamiento personalizado para sobrescribir los archivos existentes. Mi storage.py se parece a esto:

from django.core.files.storage import FileSystemStorage 

class OverwriteStorage(FileSystemStorage): 
    """ 
    Returns same name for existing file and deletes existing file on save. 
    """                
    def _save(self, name, content): 
     if self.exists(name): 
      self.delete(name) 
     return super(OverwriteStorage, self)._save(name, content) 

    def get_available_name(self, name): 
     return name 
+0

Gracias! respuesta muy detallada –

5

Se puede poner en cualquier lugar, pero se debe señalar el camino hacia allí en el settings.py

Usted puede poner este archivo storage.py en la carpeta raíz (el que tiene manage.py) y señalar el camino que storage.AlwaysOverwriteFileSystemStorage

+1

Esta debería ser la respuesta correcta, ya que resuelve el problema y no lo omite. – Ishan

Cuestiones relacionadas