0

我有自定义 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

我想要的是从模型传递这个文件名参数。
像这样的东西:

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 (很明显:))。
问题是:如何从 Storage 访问我的模型实例?

提前致谢!

4

1 回答 1

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

希望这可以帮助!

于 2013-05-18T17:21:40.343 回答