super() メソッドが呼び出される前に、アップロードされたファイルを保存する必要があります。ファイルを必要な内部形式に変換するためにいくつかの外部ユーティリティを使用しているため、保存する必要があります。以下のコードは、ファイル '123' のアップロード中にエラーを生成します。
OSError: [Errno 36] File name too long: '/var/www/prj/venv/converted/usermedia/-1/uploads/123_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_...'
super().save()
無限ループで同じ名前で2回保存しようとしているようです。また、これらすべてのファイルを作成します。
def save(self, **kwargs):
uid = kwargs.pop('uid', -1)
for field in self._meta.fields:
if hasattr(field, 'upload_to'):
field.upload_to = '%s/uploads' % uid
if self.translation_file:
self.translation_file.save(self.translation_file.name, self.translation_file)
#self.mimetype = self.guess_mimetype()
#self.handle_file(self.translation_file.path)
super(Resource, self).save(**kwargs)
編集:
これは私が回避したかったエレガントな方法です(save()
メソッドを二重に呼び出します):
def save(self, *args, **kwargs):
uid = kwargs.pop('uid', -1)
for field in self._meta.fields:
if hasattr(field, 'upload_to'):
field.upload_to = '%s/uploads' % uid
super(Resource, self).save(*args, **kwargs)
if self.__orig_translation_file != self.translation_file:
self.update_mimetype()
super(Resource, self).save(*args, **kwargs)