2011-01-28 12 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 + filenameでなければなりません。この場合、 "media/url/fs-test/image/filename.png"になりますか?何故なの?

編集: これ以上の情報はありません。

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

をし、ストレージクラスが定義されています:次のようにDjangos FileFieldにクラスは、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の

FS_TEST_URL = urlparse.urljoin(MEDIA_URL,'fs_test/') 
をurlparse使用して...あなたの先頭と末尾のスラッシュをチェック
関連する問題