2012-05-06 2 views
1

Я пытаюсь создать новый пользовательский класс хранилища на основе от S3BotoStorage, и я получаю эту ошибку с помощью следующего кода:Пользовательские S3BotoStorage ошибка конструктор класса

import sys 
from django.core.files.storage import Storage 
from storages.backends.s3boto import S3BotoStorage 


class customStorage(S3BotoStorage): 
    def __init__(self, *args, **kwargs): 
     kwargs['bucket_name'] = 'bucket_1' 
     print >> sys.stderr, 'Creating MyS3Storage'   
     super(S3BotoStorage, self).__init__(*args, **kwargs) 

Ошибка:

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner 
self._setup() 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/files/storage.py", line 285, in _setup 
self._wrapped = get_storage_class()() 
File "/Users/abisson/Sites/poka/common/storages/models.py", line 10, in __init__ 
super(S3BotoStorage, self).__init__(*args, **kwargs) 
TypeError: object.__init__() takes no parameters 

I на основе мой ответ Pointing to multiple S3 buckets in s3boto, и он не должен работать? Даже нормально, мы можем сделать:

obj1 = models.FileField(storage=S3BotoStorage(bucket='bucket_1'), upload_to=custom_upload_to) 

и он работает. (и передать аргумент конструктору)

ответ

3

Вы вызываете неправильную функцию init! Вы хотите вызвать родителя, но вы вызываете родителя родителя. Вы должны изменить свою супер() линию от:

super(S3BotoStorage, self).__init__(*args, **kwargs) 

к:

super(customStorage, self).__init__(*args, **kwargs) 

В общем, команде супер() принимает текущий объект и класс которого родительские вы хотите позвонить. Это важно, потому что могут быть случаи, когда человек действительно хочет назвать родителя родителя. Это разрешено, потому что дочерний объект по-прежнему может считаться родительским объектом, когда это необходимо.

+0

Упс! Привет, друг! – abisson