更新FileField:旧文件的名称是什么

时间:2017-05-07 20:16:04

标签: django

Django 1.11

调用FileUpdate时,我用新文件替换旧文件。 我想处理旧文件。即将其移至其他目录。

你能看看下面的图片吗?新文件被称为" C book 1.pdf"。现有文件名为" 4_Oracle_Database_11g_PLSQL_Fundamentals_PLSQL.pdf"。

但是在断点处(见form_valid中的评论),old_file_name = C book 1.pdf。

但我无法理解为什么。我在几行中调用super(FileUpdate,self).form_valid(form)。只有self.object = form.save()。

在断点处,我希望self.object是未改变的对象。现有的。

您能否帮我理解如何捕获旧文件的文件名。

class UserFile(models.Model):
    uuid = models.UUIDField(primary_key=False, default=uuid.uuid4,
                            editable=False)
    user_file = models.FileField(verbose_name=_("file"),
                                 max_length=255,
                                 upload_to=get_file_path)

class FileUpdate(UpdateView):
    model = UserFile
    form_class = FileForm

    def form_valid(self, form):
        """
        Delete old file.
        """
        parent_directory = get_parent_directory_of_file(self.object)
        old_file_name = self.object.user_file.name # Breakpoint
        self.object.user_file.delete()
        return super(FileUpdate, self).form_valid(form)

这是表格: enter image description here

1 个答案:

答案 0 :(得分:0)

编辑:要捕获文件名,您可能希望在调用is_valid()之前从文件的数据中获取它 - 即从对象实例中获取它之前模型交易发生。

关于删除旧文件..

我认为致电.delete()并未实际删除该文件 - 请参阅here

页面摘录:

  

FileField实例在数据库中创建为varchar列,默认最大长度为100个字符。

这意味着存储在数据库中的内容实际上只是文件的路径名/ url - 而不是实际的文件本身。因此,当您致电delete()时,您实际上仅删除路径名

要删除文件,您必须使用os标准库:

您可以这样做:

import os

# change to the directory where the file exists relative to this current file
# in this case, it moves up 3 levels from the current file

cdir = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))

# join the previous path with the path to the file to be deleted
# this assumes files are uploaded to `media/user_uploads` - change as you deem fit

filepath = 'media/user_uploads/' + self.object.user_file.name
file_to_delete = os.path.join(cdir, filepath)

# delete the file
os.remove(file_to_delete)

docsos.remove()的更多信息。我还没有对此进行测试,但我想你可以试一试。