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 自体をパラメーターとして渡します (明らかです :))。
問題は、ストレージからモデル インスタンスにアクセスするにはどうすればよいかということです。

前もって感謝します!

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 に答える