Skip to content
Store user preferences for other django apps
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


django-userpreferences (django-userpreferences)

This Django app has for purpose to integrate easily for other apps to use. It aims to be easily added into existing projects.



django-userpreferences requires django-picklefield. When upgrading you need south.

Installing django-userpreferences

Install into your python path using pip or easy_install:

pip install django-userpreferences
easy_install django-userpreferences

Add 'preferences' to your INSTALLED_APPS in


Add '(r'^preferences/', include('preferences.urls')' to your urls:

urlpatterns = patterns( '',
    (r'^preferences/', include('preferences.urls'),

Don't forget to run

./ syncdb

to create the table that is going to receive the preferences.

And if you are using south (you need south if you are upgrading):

./ migrate

Using django-userpreferences

Add a file to you app test_app.:


That looks like this:

        #(u'Preference Display', 'value')
        (u'Weekly', 'week'), #first item is the default value
        (u'Monthly', 'month'),
        (u'Daily', 'day'),

You can now access user preference within your views:

>>> user.preferences['test_app']
{'mailing_period' : 'week'}

>>> user.preferences['test_app'] = { 'mailing_period' : 'month' }
>>> user.preferences['test_app']
{'mailing_period' : 'month'}

Note: Though it may have some properties of a dict, user.preferences is NOT a dict. It's a Model object, dict behaviour is a shortcut for user.preferences.preferences. If you use the preferences urls, an url is made accessible to change preferences:

<a href="{% url preferences.views.change 'test_app' 'mailing_period' 'month' %}?return_url='/'>Receive monthly newsletter</a>

If the value in the database does not match any of the preferences within your, the default value will be returned (this allows to disable preferences after people actually used them without breaking your app)

String settings work nice, I did not try other things such as datetime yet, hopefully they work nice (as the settings are stored in a picklefield).

Only discrete set of settings are allowed for now. Patches welcome for preferences that could set by user input.

Changing the default separator

djatngo-userpreferences uses a separator between the app name and the preference name in forms. By default the separator is '/'. To override this in the weird case you might be needing it in some variable name, you need to change it in you file:

You can’t perform that action at this time.