2010-01-07 29 views
6

Tôi đang thực hiện một ứng dụng với django, trong đó có một mô hình với một FileField:Django - cập nhật một mô hình sẽ không xóa các FileField cũ

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

và tôi có một backend quản trị mà django quản lý các mô hình. Tôi vừa thêm tệp admin.py và django quản lý mọi thứ cho tôi

from django.contrib import admin 

from apps.gallery.models import Slideshow 

admin.site.register(Slideshow) 

Trong phần cuối, có thể thêm, xóa và cập nhật trình chiếu. Tuy nhiên, khi tôi cố gắng cập nhật trình chiếu và thay đổi hình thu nhỏ thuộc tính của nó [FileField], django sẽ không xóa tệp cũ. Do đó, sau khi cập nhật một số máy chủ được làm đầy với nhiều tập tin đó là vô ích. Câu hỏi của tôi là: làm thế nào tôi có thể làm cho django xóa các tập tin tự động sau khi cập nhật?

tôi sẽ thực sự đánh giá cao sự giúp đỡ của bạn

Trả lời

1

tôi chắc chắn rằng Django thực hiện điều này bằng cách thiết kế. Ví dụ, không thể biết liệu bất kỳ mô hình nào khác có thể đang sử dụng tệp đó hay không. Bạn cũng sẽ thực sự ngạc nhiên nếu bạn mong đợi các tập tin vẫn còn và phát hiện ra rằng django xóa nó!

Tuy nhiên, cũng có vấn đề ngay khi bạn thay đổi trường tệp, bạn mất tên tệp cũ.

Có một vé cởi mở về vấn đề đó: http://code.djangoproject.com/ticket/11663

Có một bản vá trong http://code.djangoproject.com/ticket/2983 trong đó cho thấy làm thế nào để ghi đè __set__ để lưu trữ các tên file trước. Sau đó, phương thức __save__ của mô hình của bạn có thể truy cập vào tên tệp trước đó để xóa nó.

+0

Có, bạn đã đúng! Các nhà phát triển django dường như làm việc trong một thiết kế mới cho trường hợp này trong các phiên bản mới. Một trong các tùy chọn là thêm tùy chọn bổ sung trong FileFields để tạo tệp có thể thay thế khi tải lên: http://groups.google.com/group/django-developers/browse_thread/thread/491619541ba6ac75 Tôi hỗ trợ ý tưởng này, " Cảm ơn sự giúp đỡ của bạn Seth "Tôi có thể sử dụng miếng vá mà bạn đã nói với tôi. – raulsan

+0

Chỉ cần có một ý tưởng khác - bạn có thể thử thêm tùy chọn ** show_hidden_initial ** vào 'FileField' của bạn. Có lẽ điều đó sẽ cho phép bạn truy cập vào giá trị ban đầu của 'FileField' trước khi một tệp mới được tải lên. – Seth

2

Tôi đã suy nghĩ nhiều về vấn đề này và cuối cùng tôi tìm ra giải pháp hiệu quả hơn cho tôi. Bạn có thể tìm thấy tất cả các mô hình trong dự án và kết nối các tín hiệu pre_save và post_delete với chúng.

Khi kết thúc, tôi đã tạo ứng dụng, điều này sẽ giải quyết vấn đề này - django-cleanup

+0

Trông giống như một giải pháp tuyệt vời. Tôi không làm việc trên django nữa và không thể kiểm tra nó nhưng tôi cảm ơn bạn đã đóng góp của bạn, un1t! – raulsan

Các vấn đề liên quan