2009-05-28 35 views
2

我在Django框架之上構建了一個軟件存儲庫。因爲它會包含很多文件,所以我希望它通過文件管理器查看時有一定意義。所以我首先按照他們所屬的程序的URL將這些文件分組,然後通過該URL的前兩個字母。下面是它的外觀:在Django中上傳文件:阻止FileField寫入數據庫的完整路徑

screenshot of my directory structure

的模式是這樣的:

class File(models.Model): 
    # If called like upload_to, don't put a slash in front of the result 
    # because we already have one in settings.MEDIA_ROOT 
    def get_absolute_url(self, filename=None): 
     return '%sfiles/%s/%s/%s' % ('' if filename else '/', 
            self.download.url[:2], 
            self.download.url, 
            filename or self.name) 
    name = models.FileField(upload_to=get_absolute_url, max_length=255) 
    size = models.IntegerField() 
    title = models.CharField(blank=True, max_length=255) 
    download = models.ForeignKey('Download', related_name='files') 


class Download(models.Model): 
    url = models.SlugField(unique=True, max_length=255) 
    title = models.CharField(max_length=255) 

有,但是,一個小問題:FileField或將存儲而不只是名稱的整個生成的路徑,這我寧願避免。有什麼方法可以覆蓋(可能在我自己的字段類中)什麼FileField寫入數據庫以及在加載原始字段後如何重建路徑?

回答

2
name = models.FileField(upload_to=get_absolute_url, max_length=255) 

upload_to通常看起來像這樣

upload_to ='./files' 

它會在你的磁盤存儲爲./files/your.file在db 和<MEDIA_ROOT>/files/your.file

您可以更改upload_to - 以任何形式適合您的任何編程方式

upload_to ='./files'+'/subdir' 

但它應該以 './'

FileField-Reference

get_absolute_url()應該返回像一個URL http://domain.com/sitemedia/files/your.file

編輯:

從你可以做的文件名稱中刪除路徑在File.save()中的字符串操作(如

def save(self, force_insert=False, force_update=False): 
    self.name = self.name[self.name.rfind('/')+1:] 
    super(File, self).save(force_insert, force_update) 
相關問題