I am new to Python decorators so perhaps I am missing something simple, here is my situation:
This works for me:
def test_something(self):
settings.SETTING_DICT['key'] = True #no error
...
But this throws a "SyntaxError: keyword can't be an expression":
@override_settings(SETTING_DICT['key'] = True) #error
def test_something(self):
...
Just to be clear, normal use of override settings works:
@override_settings(SETTING_VAR = True) #no error
def test_something(self):
...
Is there a way to use the decorator with a settings dictionary, or am I doing something wrong?
Thanks in advance!
You should override the whole dict:
@override_settings(SETTING_DICT={'key': True})
def test_something(self):
...
Or, you can use override_settings
as a context manager:
def test_something(self):
value = settings.SETTING_DICT
value['key'] = True
with override_settings(SETTING_DICT=value):
...
I didn't want to override the whole dict either, so I copied the dictionary in question from the settings
object and just modified the attribute I was interested in:
import copy
from django.conf import settings
settings_dict = deepcopy(settings.SETTINGS_DICT)
settings_dict['key1']['key2'] = 'new value'
@override_settings(SETTINGS_DICT=settings_dict)
def test_something(self):
pass
It suits my purposes, but if you wanted to make this more widely usable, you could write a short function with a few arguments which could do something like this dynamically.
Note: I tried using settings.SETTINGS_DICT.copy()
instead of deepcopy(settings.SETTINGS_DICT)
but that seemed to globally override the setting for all tests...
来源:https://stackoverflow.com/questions/24214636/django-override-settings-does-not-allow-dictionary