【问题标题】:Update FileField: what is the name of the old file更新 FileField:旧文件的名称是什么
【发布时间】:2017-10-05 18:45:55
【问题描述】:

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)

这是表格:

【问题讨论】:

    标签: django


    【解决方案1】:

    编辑:要捕获文件名,您可能希望在调用 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)
    

    docs 中了解更多关于os.remove() 的信息。我还没有测试过,但我想你可以试一试。

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 2011-02-02
      • 2014-08-09
      • 1970-01-01
      • 2014-10-05
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多