I'd like to expose some (app-specific) settings to the admin interface, so users can change them comfortably and also not have to restart Django.
How should I go about this?
I checked out the applications on http://djangopackages.com/grids/g/live-setting/ (btw django-constance was the most appealing) but really what all these apps are doing is storing values in a database, providing a web interface to change them, and caching. Aren't the first two features already built into Django?
The biggest drawbacks I see are that none of the apps are drop-in replacements for the old location of these settings (settings.py), and require me to migrate to their notation, and often add another context processor to access them in templates.
Couldn't I just do this?
- Create a model for my settings (this gives me the various types and validation)
- Instantiate one such object to hold my settings (this allows the users to edit them in the admin interface) - I could dump defaults as fixtures like for other models
- Wrap settings.py so it makes a database query for my settings - http://www.loose-bits.com/2011/04/extending-django-settings-with-derived.html
From my current, naive point of view the only drawbacks I see would be:
- Adding or changing the available settings requires a schema migration (south). - I can live with that.
- I have a model with possibly multiple instances but really only need a singleton. - That could actually be a useful feature at some point.
- Performance/Caching: Looking at http://code.djangoproject.com/svn/django/trunk/django/conf/ I'd have to put a little bit of cleverness into the settings wrapper and/or model, so that model changes clear or update cached values. - doesn't seem to be rocket science.
- Doing the same in another project would require a similar effort again. - I think a single dictionary constant in settings.py, holding model name(s) and field names for the lookups is all that would differ.
Wouldn't this be the best of both worlds - runtime admin (with all its perks), database backend, caching, and none of my settings.USED_TO_BE_IN_SETTINGS_DOT_PY would need any changing. Am I missing something?
django.conf.settings
like you are used there is no way you can achieve what you want, except hacking Django itself. You should migrate your call to settings at least (code migration) to use the settings object provided by the external library. – Idzikfrom django.conf import settings
it would then befrom my_settings_app import settings
in my apps which are using it. In this case the last is access the db/cache and fallback to default settings if both of them not exist. Is that not what you mean? – Idzikfrom django.conf import settings
it will have the same effect as before, meaning importing the settings objects from django/conf/__init__.py, which is also just a wrapper around you project settings file. It is not intended to wrap another Object according to code. Again: except you hack into Django itself. – Idzik