2011-01-28 24 views
1

我有模型,只用一个ImageField进行测试。这ImageField的必然像下面这样的FileSystemStorage:Django如何构造FileSystemStorage返回的url?

fs_test = FileSystemStorage(location = settings.FS_TEST_FILES, 
          base_url = settings.FS_TEST_URL) 

class TestModel(models.Model): 
    image = models.ImageField(storage=fs_test,upload_to='image') 

的设置是这样的:

FS_TEST_FILES = os.path.normpath(MEDIA_ROOT+'/fs_test') 
FS_TEST_URL = os.path.normpath(MEDIA_URL+'/fs_test/') 

上传时,文件被上传到“媒体/根/ fs_test /图像/文件名。 PNG”。不用担心,直到这里。但是当调用“image.url”时,我得到“media/url/image/filename.png”。不应该是base_url +文件名,在这种情况下,它会是“media/url/fs-test/image/filename.png”吗?为什么不?

编辑: 一些关于此的更多信息。 Django的FileField字段类定义的URL访问如下:

def _get_url(self): 
    self._require_file() 
    return self.storage.url(self.name) 
url = property(_get_url) 

和存储类定义:

def url(self, name): 
    if self.base_url is None: 
     raise ValueError("This file is not accessible via a URL.") 
    return urlparse.urljoin(self.base_url, name).replace('\\', '/') 

,但我的代码返回标准MEDIA_URL,而不是在fs_test定义的BASE_URL。

回答

3

查看您所在的前沿和后斜线......而不是使用OS里urlparse

FS_TEST_URL = urlparse.urljoin(MEDIA_URL,'fs_test/')