2013-05-18 50 views
0

我有自定義的FileSystemStorage。
這個想法是傳遞可選的文件名參數。
我custome STORGE代碼:從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是什麼通過從模型這個文件名參數。
有些事是這樣的:

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')) 

但在這種情況下,Django的傳遞作爲參數本身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的實例。不是這個班級,所以有可能你會使用同一個實例來存儲所有文件,這會給我帶來衝突filename。你可以這樣嘗試:storage=SalesMapFileStores

希望這有助於!