【问题标题】:Django - Replace file of a FileField with file from another FileFieldDjango - 用另一个 FileField 中的文件替换 FileField 的文件
【发布时间】:2015-07-30 05:25:39
【问题描述】:

我有两个型号都有FileField,就像这样:

class OriginalFile(models.Model):
    docfile = models.FileField(upload_to=file_path)

class RevisedFile(models.Model):
    newfile = models.FileField(upload_to=revisedfile_path)
    originalfile = models.ForeignKey(OriginalFile, on_delete=models.PROTECT)

如您所见,第一次上传文件时,它会上传到OriginalFile 模型中的file_path。但是,如果用户上传同一文件的修订版,它会保存到 RevisedFile 模型中的 revisedfile_path

普通用户无权自行修改文件(这就是我当时不替换原始文件的原因)。如果经理接受修改后的文件,则需要发生以下事情:

  1. OriginalFiledocfile 替换为RevisedFilenewfile
  2. 删除RevisedFile的相关实例及其保存在目录中的newfile

docfilenewfile 的名称可以假定为相同。我不知道如何解决这个问题。任何形式的帮助都将不胜感激。谢谢。

【问题讨论】:

  • 听起来用户可以访问您的文件系统并且您上传到不同的目录以限制非管理员用户的访问。是这样吗?
  • 是的,普通用户使用表单上传文件。

标签: django django-models filefield


【解决方案1】:

删除任何用户对您的文件系统的访问权限。使用 FK 而不是直接操作文件。不要删除旧文件,而是不要显示旧文件。

class DocFile(models.Model):
    file = models.FileField(upload_to=file_path)  # Single path for all doc files

class Document(models.Model):
    # Optional name, description fields 
    approved = models.FK(DocFile)
    revisions = models.ManyToManyField(DocFile)

当普通用户上传文件时,将其添加到 Document.revisions,如果它是唯一的修订版,则也将其设置为已批准。

为管理员创建一个权限组,并允许他们在管理员中编辑文档。这样,他们可以选择与 Document 关联的 DocFile 中的哪些是已批准的。无需传输文件,您不会丢失文件的版本,并且您的文件系统不受 rm -r 影响。经理还可以下载文件进行审查

【讨论】:

  • 访问文件系统是指用户可以上传文件。不以任何方式查看/更改文件或访问目录。另外,我认为按照您的建议,如果用户经常上传修改过的文件,将会有很多孤立文件。这是我想避免的事情之一。另外,由于修改后的文件和原始文件将具有相同的名称,这会导致任何问题吗?
  • 您仍然可以从管理员中删除文件或添加额外的逻辑以在更改批准时删除修订。孤立文件没什么好怕的。
  • 如果批准的 DocFile 是在所有修订中最后上传的,您可以将上传时间添加到 DocFile 并让 cronjob 删除文件。
  • 谢谢。我会试试这个。但是,我发现了一个有趣的解决方案,它删除了文件和实例。link
猜你喜欢
  • 2022-01-16
  • 2011-10-08
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多