config and manage typed extra settings using just the django admin.
- Run
pip install django-extra-settings - Add
extra_settingstosettings.INSTALLED_APPS - Run
python manage.py migrate - Run
python manage.py collectstatic - Restart your application server
- Just go to the admin where you can
create,updateanddeleteyour settings.
All these settings are optional, if not defined in settings.py the default values (listed below) will be used.
# the name of the installed app for registering the extra settings admin.
EXTRA_SETTINGS_ADMIN_APP = "extra_settings"# the name of the cache to use, if not found the "default" cache will be used.
EXTRA_SETTINGS_CACHE_NAME = "extra_settings"# a list of settings that will be available by default, each item must contain "name", "type" and "value".
# check the #types section to see all the supported settings types.
EXTRA_SETTINGS_DEFAULTS = [
{
"name": "SETTING_NAME",
"type": "string",
"value": "Hello World",
},
# ...
]# if True, settings names will be forced to honor the standard django settings format
EXTRA_SETTINGS_ENFORCE_UPPERCASE_SETTINGS = True# if True, the template tag will fallback to django.conf.settings,
# very useful to retrieve conf settings such as DEBUG.
EXTRA_SETTINGS_FALLBACK_TO_CONF_SETTINGS = True# the upload_to path value of settings of type 'file'
EXTRA_SETTINGS_FILE_UPLOAD_TO = "files"# the upload_to path value of settings of type 'image'
EXTRA_SETTINGS_IMAGE_UPLOAD_TO = "images"# if True, settings name prefix list filter will be shown in the admin changelist
EXTRA_SETTINGS_SHOW_NAME_PREFIX_LIST_FILTER = False# if True, settings type list filter will be shown in the admin changelist
EXTRA_SETTINGS_SHOW_TYPE_LIST_FILTER = False# the package name displayed in the admin
EXTRA_SETTINGS_VERBOSE_NAME = "Settings"Warning
When using Celery's autodiscover_tasks with force=True, it triggers an aggressive task discovery that accesses Django settings before they're fully initialized. This premature access prevents django-extra-settings from properly setting up its default configuration values. More info here.
You can display the settings model admin in another installed app group by using the EXTRA_SETTINGS_ADMIN_APP setting.
You can also have a more advanced control, by registering the settings admin with multiple installed apps and filtering each app settings using the queryset_processor argument.
โ ๏ธ If you do either of the above, you must run migrations for each app that will displayextra_settingsmodel admin in its admin (because django creates migrations even for proxy models).
In your custom app photos.admin module:
from extra_settings.admin import register_extra_settings_admin
register_extra_settings_admin(
app=__name__,
queryset_processor=lambda qs: qs.filter(name__istartswith="PHOTOS_"),
unregister_default=True,
)In your custom app videos.admin module:
from extra_settings.admin import register_extra_settings_admin
register_extra_settings_admin(
app=__name__,
queryset_processor=lambda qs: qs.filter(name__istartswith="VIDEOS_"),
unregister_default=True,
)By default the "extra_settings" app has its own admin app group.
You can customise the app caching options using settings.CACHES["extra_settings"] setting, otherwise the "default" cache will be used:
CACHES = {
# ...
"extra_settings": {
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
"TIMEOUT": 60,
},
# ...
}By default the "extra_settings" cache is used, if you want to use another cache you can set it using the EXTRA_SETTINGS_CACHE_NAME setting.
You can create, read, update and delete settings programmatically:
This is the list of the currently supported setting types you may need to use:
Setting.TYPE_BOOLSetting.TYPE_DATESetting.TYPE_DATETIMESetting.TYPE_DECIMALSetting.TYPE_DURATIONSetting.TYPE_EMAILSetting.TYPE_FILESetting.TYPE_FLOATSetting.TYPE_IMAGESetting.TYPE_INTSetting.TYPE_JSONSetting.TYPE_STRINGSetting.TYPE_TEXTSetting.TYPE_TIMESetting.TYPE_URL
from extra_settings.models import Setting
setting_obj = Setting(
name="SETTING_NAME",
value_type=Setting.TYPE_STRING,
value="django-extra-settings",
)
setting_obj.save()from extra_settings.models import Setting
value = Setting.get("SETTING_NAME", default="django-extra-settings")from extra_settings.models import Setting
setting_obj = Setting(
name="SETTING_NAME",
value_type=Setting.TYPE_BOOL,
value=True,
)
setting_obj.value = False
setting_obj.save()from extra_settings.models import Setting
Setting.objects.filter(name="SETTING_NAME").delete()You can define a custom validator for each setting:
- Validators must be defined using full python path, eg.
myapp.mymodule.my_validator. - Validators are called passing a single argument (the value of the setting) and if the value is valid, they should return
True, otherwise returningFalseorNoneaValidationErroris raised.
You can retrieve settings in templates:
{% load extra_settings %}
{% get_setting 'SETTING_NAME' default='django-extra-settings' %}You can override specific settings during tests using extra_settings.test.override_settings.
It can be used both as decorator and as context-manager:
from extra_settings.test import override_settings
# decorator
@override_settings(SETTING_NAME_1="value for testing 1", SETTING_NAME_2="value for testing 2")
def test_with_custom_settings(self):
pass
# context manager
def test_with_custom_settings(self):
with override_settings(SETTING_NAME_1="value for testing 1", SETTING_NAME_2="value for testing 2"):
pass# clone repository
git clone https://github.com/fabiocaccamo/django-extra-settings.git && cd django-extra-settings
# create virtualenv and activate it
python -m venv venv && . venv/bin/activate
# upgrade pip
python -m pip install --upgrade pip
# install requirements
pip install -r requirements.txt -r requirements-test.txt
# install pre-commit to run formatters and linters
pre-commit install --install-hooks
# run tests
tox
# or
python runtests.py
# or
python -m django test --settings "tests.settings"Released under MIT License.
- โญ Star this project on GitHub
Follow me on GitHub- ๐ Follow me on Bluesky
- ๐ฐ Sponsor me on Github
-
django-admin-interface- the default admin interface made customizable by the admin itself. popup windows replaced by modals. ๐ง โก -
django-cache-cleaner- clear the entire cache or individual caches easily using the admin panel or management command. ๐งนโจ -
django-colorfield- simple color field for models with a nice color-picker in the admin. ๐จ -
django-maintenance-mode- shows a 503 error page when maintenance-mode is on. ๐ง ๐ ๏ธ -
django-redirects- redirects with full control. โช๏ธ -
django-treenode- probably the best abstract model / admin for your tree based stuff. ๐ณ -
python-benedict- dict subclass with keylist/keypath support, I/O shortcuts (base64, csv, json, pickle, plist, query-string, toml, xml, yaml) and many utilities. ๐ -
python-codicefiscale- encode/decode Italian fiscal codes - codifica/decodifica del Codice Fiscale. ๐ฎ๐น ๐ณ -
python-fontbro- friendly font operations. ๐งข -
python-fsutil- file-system utilities for lazy devs. ๐งโโ๏ธ
