Django:在调用super()之前保存FileField

时间:2012-08-25 07:13:01

标签: python django filefield

我需要在调用 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()中以无限循环中的相同名称将其保存两次。此外,它会创建所有这些文件。

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)

1 个答案:

答案 0 :(得分:2)

你的第一个例子中有一个无限循环,没错。 调用self.translation_file.save(self.translation_file.name, self.translation_file)会将上传的文件保存到磁盘并再次调用Resources类的save方法,因为这些方法将参数默认设置为true(看看https://docs.djangoproject.com/en/dev/ref/files/file/#additional-methods-on-files-attached-to-objects)以及自定义FileField无论如何。 / p>

这样调用它(只需添加save = False)更有可能起作用:

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

我希望这指向正确的方向。