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)
答案 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)
docs中os.remove()
的更多信息。我还没有对此进行测试,但我想你可以试一试。