0

ファイル名もファイル名へのフルパスなしで保存する必要があります。私はそうしています:

class Photo(models.Model):
    photo = models.ImageField(upload_to = settings.PATH_PHOTOS_SOURCE)
    user = models.ForeignKey(UserProfile, editable=False)
    item = models.ForeignKey(Item, default=0)
    filename = models.CharField(max_length=100, default='', editable=False)

    def save(self, *args, **kwargs):
        self.filename = os.path.basename(self.photo.url)
        super(Photo, self).save(*args, **kwargs)

それはうまくいきますが、既存の名前のファイルが既に存在し、オフコースでディスクにファイルexample_1.jpg、example_2.jpgを書き込みますが、ファイル名に間違ったファイル名example.jpgを保存する場合があります

保存方法を次のように変更しました。

def save(self, *args, **kwargs):
    super(Photo, self).save(*args, **kwargs)        
    self.filename = os.path.basename(self.photo.url)
    super(Photo, self).save()

それはうまくいきましたが、私はこのコードが好きではありません。おそらくもっとエレガントなコードです。

シグナルでこれをやろうとしましたが、再帰の保存に問題がありました。

4

1 に答える 1

2

の代わりにsettings.PATH_PHOTOS_SOURCE関数を upload_to に渡します。

def upload_path_handler(self, filename):
    return os.path.join(settings.PATH_PHOTOS_SOURCE,
                        os.path.basename(self.photo.url))

# in model
photo = models.ImageField(upload_to=upload_path_handler)

ファイル名にモデル インスタンス ID を使用する場合は、現在のモデル ID を使用して Django 管理ファイルのアップロードを参照してください。

ファイル名として直接使用しても安全であることを確認するために、photo.url の可能な値を考慮する必要がある場合があります。

于 2012-04-10T12:53:37.840 に答える