2013-05-18 45 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

希望这有助于!