Как Django создает URL-адрес, возвращаемый FileSystemStorage? - PullRequest
1 голос
/ 28 января 2011

У меня есть модель, для целей тестирования только с 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 /изображение / filename.png».Не беспокойся, пока здесь.Но при вызове «image.url» я получаю «media / url / image / filename.png».Разве это не должно быть base_url + filename, которое в этом случае будет "media / url / fs-test / image / filename.png"?Почему бы и нет?

edit: Еще немного информации об этом.Класс 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, а не base_url, определенный в fs_test.

1 Ответ

3 голосов
/ 29 января 2011

Проверьте свои начальные и конечные слэши ... используйте urlparse вместо os

FS_TEST_URL = urlparse.urljoin(MEDIA_URL,'fs_test/')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...