2013-05-18 3 views
0

У меня есть пользовательский FileSystemStorage.
Идея состоит в том, чтобы передать необязательный параметр имени файла.
Моего код Custome сторга:Доступ к модели из FileSystemStorage

class SalesMapFileStores(FileSystemStorage): 
    def __init__(self, location=None, base_url=None, filename=None): 
     if filename: 
      self.filename = filename 
     super(SalesMapFileStores, self).__init__(location=location, base_url=base_url) 

    def get_available_name(self, name): 
     return name 

    def get_valid_name(self, name): 
     if self.filename: 
      return self.filename 
     return name 

    def _save(self, name, content): 
     if self.exists(name): 
      self.delete(name) 
     return super(SalesMapFileStores, self)._save(name, conten 

Что я whant должен передать этот параметр имя_файла от модели.
Somethin как это:

class SalesMapImage(models.Model): 
    name = models.CharField(max_length=254, verbose_name='Filename') 
    image = SalesMapImageField(upload_to='SalesMap/Test', storage=SalesMapFileStores(filename=name), verbose_name='Test Image', 
           content_types=('image/jpeg', 'image/png')) 

Но в этом случае, Джанго проходит как сам параметр model.CharField (это очевидно :)).
Вопрос: Как получить доступ к экземпляру моей модели из хранилища?

Заранее благодарен!

ответ

0

Ну, это немного сумасшедшая идея, но вы можете попробовать переопределить назначение в этой области в этом классе, так что экземпляр SalesMapFileStores всегда держать в синхронизации с name поле, как это:

class SalesMapImage(models.Model): 
    name = models.CharField(max_length=254, verbose_name='Filename') 
    image = SalesMapImageField(upload_to='SalesMap/Test', storage=SalesMapFileStores(), verbose_name='Test Image', 
           content_types=('image/jpeg', 'image/png')) 

    def __setattr__(self, key, value): 
     self.__dict__[key]=value 
     if key=='name': 
      self.image.storage.filename = value 

а также Общая идея - связать присвоение значения с обновлением поля имени файла.

Предполагается, что вы не хотите обновлять его вручную из своего вида. Потому что это не потребует больших усилий, чтобы сделать model_instance.storage.filename = self.name или даже добавить метод в свой собственный класс хранения, чтобы обновить имя файла.

ОБНОВЛЕНИЕ: Головки для storage=SalesMapFileStores(). Там вы проходите экземпляр SalesMapFileStores. Не класс, так что, возможно, вы будете использовать тот же instace для хранения всех файлов, и это приведет к конфликтам с filename. Вы можете попробовать следующее: storage=SalesMapFileStores

Надеюсь, это поможет!