简单的Django管理应用程序-如何跟踪文件版本

2024-10-01 00:18:15 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个带有FileField的Django模型,例如

class Probe(models.Model):
    name =  models.CharField(max_length=200, unique=True)
    nanoz_file = models.FileField(upload_to='nanoz_file', blank=True)

如果用户在管理界面上传一个新文件,有没有办法防止上传的文件被覆盖?在

另外,如果我确实保留了旧文件,是否有方法可以将以前的文件关联回模型实例?在

也就是说,我希望能够列出一个给定模型实例上传到nanoz_文件字段的所有文件。在


Tags: 文件django实例name模型truemodelmodels
3条回答

您可以使用以下结构:

class File(models.Model):
    name = models.CharField()
    file = models.FileField(upload_to='files_storage/')
    belongs = models.ForeignKey('self')
    creation = models.DateTimeField(auto_now_add=True)

然后在视图中可以使用类似于:

^{pr2}$

希望这有帮助!在

正如jpic所说,你可以尝试django reversion,或者

  • 在数据库中跟踪过去文件的名称,例如在单独的表行、自定义字段或gfk字段中。在
  • 全局文件在线,只要文件名是管理的。在

对于第二种方法,实际上对于处理w/all用户上传,最好按照您设计的模式命名文件,而不是使用原始名称(您也可以存储原始名称以供以后使用)。对于您的情况,由于“名称”字段是唯一的,因此如果该字段很少更改,则该字段适合作为生成上载文件的文件名的基础:

import os.path
from django.hash_compat import sha_constructor

def upload_to(self, filename):  
    return 'nanoz_file/%s%s' % (
        sha_constructor(self.name).hexdigest(), os.path.splitext(filename)[-1])

class Probe(models.Model):
    name =  models.CharField(max_length=200, unique=True)
    nanoz_file = models.FileField(upload_to=upload_to, blank=True)

然后在您的视图中,您可以通过

^{pr2}$

Django从不覆盖上载的文件。如果你上传'巴布亚新几内亚“两次,第二次是‘foo逖1.png’——我刚测试过这个,但不要相信我的话:也试试看!在

您所要做的(或者让django reversion来做)就是跟踪以前的文件名。在

相关问题 更多 >