Django如何构造FileSystemStorage返回的url?

时间:2011-01-28 20:15:34

标签: django storage

我有模型,仅用于ImageField的测试目的。此ImageField绑定到FileSystemStorage,如下所示:

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/')

上传时,文件会上传到“media / root / fs_test / image / filename.png”。不要担心,直到这里。但是当调用“image.url”时,我得到“media / url / image / filename.png”。不应该是base_url + filename,在这种情况下是“media / url / fs-test / image / filename.png”?为什么不呢?

修改 有关此问题的更多信息。 Djangos FileField类定义url访问,如下所示:

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

并且Storage类定义:

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。

1 个答案:

答案 0 :(得分:3)

检查你的前导和尾随斜杠...使用urlparse而不是os

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