2011-02-24 10 views
9

Estoy tratando de usar un almacenamiento de archivos personalizado (https://bitbucket.org/david/django-storages/wiki/S3Storage). Seguí las instrucciones y poner esto en mi settings.pyAlmacenamiento de archivos predeterminado personalizado en Django

DEFAULT_FILE_STORAGE='storages.backends.s3boto.S3BotoStorage' 

Cuando voy a importar default_storage, no es del tipo S3BotoStorage. Tengo que hacer la llamada a _setup(). Pero cuando hago eso, el campo de mi modelo sigue siendo del tipo DefaultStorage

Python 2.6.6 (r266:84292, Dec 29 2010, 22:02:51) 
[GCC 4.2.1 (Apple Inc. build 5646) (dot 1)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from django.core.files.storage import default_storage 
>>> print default_storage 
<django.core.files.storage.DefaultStorage object at 0x1016f7c10> 
>>> print default_storage._wrapped 
None 
>>> from base.models import Payload 
>>> p = Payload() 
>>> p.original.storage 
<django.core.files.storage.DefaultStorage object at 0x1016f7c10> 
>>> default_storage._setup() 
>>> print default_storage._wrapped 
<storages.backends.s3boto.S3BotoStorage object at 0x101ddd8d0> 
>>> p.original.storage 
<django.core.files.storage.DefaultStorage object at 0x1016f7c10> 
>>> 

¿Cómo puede ser el campo de mi modelo del tipo S3BotoStorage?

+2

Tengo este mismo problema, ¿alguna vez resolvió el problema? – James

Respuesta

4

Por lo que entiendo de los almacenes de django, la clase de almacenamiento siempre será DefaultStorage (a menos que la establezcas explícitamente en el modelo). Está en la clase _wrapped que debería verse. ¿Ha intentado imprimir "p.original.storage._wrapped"?

Por mi parte, obtengo los mismos resultados que usted, pero si imprimo p.original.storage._wrapped, obtengo mi clase de almacenamiento personalizada (en mi caso).

Si desea asegurarse de que se aplica el almacenamiento correcto a su campo, también puede establecer el almacenamiento directamente en el modelo. Por ejemplo:

from l3i.shortcuts.storage import UniqueFileStorage 
class TestModel(models.Model): 
    file = models.FileField(upload_to='file', storage=UniqueFileStorage()) 

En ese caso, se puede hacer p.file.storage y obtendrá la clase personalizada en lugar de la envoltura DefaultStorage.

+0

Esto funcionó para mí. Sin embargo, según los ejemplos de django-storage, no parece necesario configurar explícitamente el almacenamiento en el campo modelo. Esto significa que no puedo simplemente cambiar la configuración para cambiar los enfoques de almacenamiento. Sin embargo, eso no parece funcionar, ¡y tu respuesta sí lo hace! ¡Gracias! – Guerry

Cuestiones relacionadas