首页 文章

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

提问于
浏览
0

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成为未改变的对象 . 现有的 .

Could you help me understand how to catch the file name of the old file.

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

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


    关于删除旧文件..

    我认为调用 .delete() 实际上并没有删除该文件 - 请参阅here .

    页面摘录:

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

    这意味着存储在数据库中的内容实际上只是文件的路径名/ url - 而不是实际的文件本身 . 所以当你拨打 delete() 时,你基本上是 only deleting the pathname .

    要删除文件,您必须使用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)
    

    更多关于 os.remove()os.remove() . 我没有测试过这个,但我想你可以试一试 .

相关问题