diff --git a/django/utils/functional.py b/django/utils/functional.py index 65a9b9d7aaa4a..e6dbeb32e05f7 100644 --- a/django/utils/functional.py +++ b/django/utils/functional.py @@ -280,6 +280,13 @@ def __setattr__(self, name, value): self._setup() setattr(self._wrapped, name, value) + def __delattr__(self, name): + if name == "_wrapped": + raise TypeError("can't delete _wrapped.") + if self._wrapped is None: + self._setup() + delattr(self._wrapped, name) + def _setup(self): """ Must be implemented by subclasses to initialise the wrapped object. diff --git a/tests/regressiontests/settings/__init__.py b/tests/regressiontests/settings/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/tests/regressiontests/settings/models.py b/tests/regressiontests/settings/models.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/tests/regressiontests/settings/tests.py b/tests/regressiontests/settings/tests.py new file mode 100644 index 0000000000000..fa217b1d79951 --- /dev/null +++ b/tests/regressiontests/settings/tests.py @@ -0,0 +1,17 @@ +import unittest +from django.conf import settings + +class SettingsTests(unittest.TestCase): + + # + # Regression tests for #10130: deleting settings. + # + + def test_settings_delete(self): + settings.TEST = 'test' + self.assertEqual('test', settings.TEST) + del settings.TEST + self.assertRaises(AttributeError, getattr, settings, 'TEST') + + def test_settings_delete_wrapped(self): + self.assertRaises(TypeError, delattr, settings, '_wrapped')