From 8bca33f68acc4fc881146c4b9cf4101a8bfab437 Mon Sep 17 00:00:00 2001 From: Ahmed Nassar Date: Sun, 6 Apr 2025 08:45:28 +0200 Subject: [PATCH] Fixed #36269 -- Documented how to test callable storage in FileField. --- docs/topics/files.txt | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/topics/files.txt b/docs/topics/files.txt index 0a983b6cd3..0c4d1e5c6c 100644 --- a/docs/topics/files.txt +++ b/docs/topics/files.txt @@ -272,3 +272,36 @@ use :data:`~django.core.files.storage.storages`:: class MyModel(models.Model): upload = models.FileField(storage=select_storage) + +Because the callable is evaluated when your models classes are loaded, if you +need to override the :setting:`STORAGES` setting in tests, you should use a +``LazyObject`` subclass instead:: + + from django.core.files.storage import storages + from django.utils.functional import LazyObject + + + class OtherStorage(LazyObject): + def _setup(self): + self._wrapped = storages["mystorage"] + + + my_storage = OtherStorage() + + + class MyModel(models.Model): + upload = models.FileField(storage=my_storage) + +The ``LazyObject`` delays the evaluation of the storage until it's actually +needed, allowing :func:`~django.test.override_settings` to take effect:: + + @override_settings( + STORAGES={ + "mystorage": { + "BACKEND": "django.core.files.storage.InMemoryStorage", + } + } + ) + def test_storage(): + model = MyModel() + assert isinstance(model.upload.storage, InMemoryStorage)