2010-01-07 51 views
6

我实现Django的一个应用程序,它有一个FileField字段的模型:Django的 - 更新模式不会删除旧的FileField

class Slideshow(models.Model): 
    name = models.CharField(max_length=30,unique=True) 
    thumbnail = models.FileField(max_length=1000,upload_to="images/app/slideshows/thumbnails") 

,我有Django在何处管理模式的管理后台。我刚刚加入的文件admin.py和Django的管理了我的一切

from django.contrib import admin 

from apps.gallery.models import Slideshow 

admin.site.register(Slideshow) 

在后端,可以添加,删除和更新的幻灯片。但是,当我尝试更新幻灯片并更改其属性缩略图[FileField]时,django不会删除旧文件。因此,在几次更新之后,服务器充满了许多无用的文件。 我的问题是:如何让django在更新后自动删除这些文件?

我真的很感谢你的帮助

回答

1

我敢肯定,Django是通过设计来实现这一点的。例如,它不知道是否有其他模型可能正在使用该文件。如果您希望文件保留并发现django将其删除,您也会感到惊讶!

但是,还有一个问题是,只要更改文件字段,就会丢失旧文件名。

有一个关于这个问题的公开售票:http://code.djangoproject.com/ticket/11663

有一个在http://code.djangoproject.com/ticket/2983一个补丁,它演示如何重写__set__存储一个文件名。然后,您的模型的__save__方法可以访问以前的文件名来删除它。

+0

是的,你是对的! Django开发人员似乎在新版本中为这种情况下的新设计工作。 其中一个选项是在FileFields中添加一个附加选项,以使文件在上载时可以替换: http://groups.google.com/group/django-developers/browse_thread/thread/491619541ba6ac75 我支持这个想法, “谢谢你的帮助塞思“我可能会使用你告诉我的那个补丁。 – raulsan 2010-01-07 23:20:27

+0

刚刚有另一个想法 - 你可以尝试添加** show_hidden_​​initial **选项到你的'FileField'。据推测,这会让你在上传新文件之前访问'FileField'的原始值。 – Seth 2010-01-10 21:12:14

2

我对这个问题想了很多,最终找到了一个解决方案,对我来说效果不错。您可以在项目中找到所有模型,并将pre_save和post_delete信号连接到它们。

最后我做了应用程序,解决了这个问题 - django-cleanup

+0

看起来像一个很好的解决方案。我不再在django上工作,不能测试它,但我感谢您的贡献,un1t! – raulsan 2012-08-29 17:04:57

相关问题