2017-05-07 61 views
0

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

当FileUpdate被调用时,我代替旧的文件与新的。 我想处理旧文件。即将其移动到其他目录。

你可以看看下面的图片。新文件被称为“C书1.pdf”。现有文件被称为“4_Oracle_Database_11g_PLSQL_Fundamentals_PLSQL.pdf”。

但在断点处(请参阅form_valid中的注释),old_file_name = C book 1.pdf。

但我不明白为什么。我在几行中调用超级(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

回答

0

编辑:为了赶上的文件名,你可能想is_valid()之前从文件的数据把它叫做 - 即从对象得到它在模型事务发生之前的实例。


关于你的旧文件的删除..

我相信调用.delete()实际上并没有删除文件 - 见here

从页面的摘录:

的FileField实例在你的数据库具有100个字符的默认最大长度VARCHAR列创建。

这意味着存储在数据库中的内容实际上只是文件的路径名/ 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) 

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

相关问题