1

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)
4

1 に答える 1

3

最初の例で無限ループが発生しました。その通りです。メソッドを呼び出すself.translation_file.save(self.translation_file.name, self.translation_file)と、アップロードされたファイルがディスクに保存され、Resources クラスの save メソッドが再度呼び出されます。これは、メソッドの save パラメータのデフォルトが true であるためです ( https://docs.djangoproject.com/en/dev/ref/files/file/#を参照)。 additional-methods-on-files-attached-to-objects )、カスタム FileField と同様にとにかく行います。

次のように呼び出すと (save=False を追加するだけ)、動作する可能性が高くなります。

self.translation_file.save(self.translation_file.name, self.translation_file, save = False)

これが正しい方向を指していることを願っています。

于 2012-08-25T21:11:33.037 に答える