我有自定义FileSystemStorage 想法是传递可选的文件名参数 我的客户storge代码:
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
我想从模型中传递这个文件名参数 有点像这样:
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作为参数本身传递模型.CharField(它显而易见:))。
问题是:如何从存储中访问我的模型实例?
提前谢谢!
答案 0 :(得分: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
希望这有帮助!