ソースを参照

Also allowed a non-overridden setting to be deleted

Refs #20032, #18824. Thanks ztorstri at gmail.com for the report.
Claude Paroz 11 年 前
コミット
3417ba0309
3 ファイル変更13 行追加2 行削除
  1. 3 2
      django/conf/__init__.py
  2. 5 0
      docs/topics/testing/tools.txt
  3. 5 0
      tests/settings_tests/tests.py

+ 3 - 2
django/conf/__init__.py

@@ -153,11 +153,12 @@ class UserSettingsHolder(BaseSettings):
 
     def __setattr__(self, name, value):
         self._deleted.discard(name)
-        return super(UserSettingsHolder, self).__setattr__(name, value)
+        super(UserSettingsHolder, self).__setattr__(name, value)
 
     def __delattr__(self, name):
         self._deleted.add(name)
-        return super(UserSettingsHolder, self).__delattr__(name)
+        if hasattr(self, name):
+            super(UserSettingsHolder, self).__delattr__(name)
 
     def __dir__(self):
         return list(self.__dict__) + dir(self.default_settings)

+ 5 - 0
docs/topics/testing/tools.txt

@@ -1193,6 +1193,11 @@ have been overridden, like this::
         del settings.LOGIN_URL
         ...
 
+.. versionchanged:: 1.7
+
+    Previously, you could only simulate the deletion of a setting which was
+    explicitely overridden.
+
 When overriding settings, make sure to handle the cases in which your app's
 code uses a cache or similar feature that retains state even if the setting is
 changed. Django provides the :data:`django.test.signals.setting_changed`

+ 5 - 0
tests/settings_tests/tests.py

@@ -232,10 +232,15 @@ class SettingsTests(TestCase):
         Allow deletion of a setting in an overridden settings set (#18824)
         """
         previous_i18n = settings.USE_I18N
+        previous_l10n = settings.USE_L10N
         with self.settings(USE_I18N=False):
             del settings.USE_I18N
             self.assertRaises(AttributeError, getattr, settings, 'USE_I18N')
+            # Should also work for a non-overridden setting
+            del settings.USE_L10N
+            self.assertRaises(AttributeError, getattr, settings, 'USE_L10N')
         self.assertEqual(settings.USE_I18N, previous_i18n)
+        self.assertEqual(settings.USE_L10N, previous_l10n)
 
     def test_override_settings_nested(self):
         """