django-profiles /

Filename Size Date modified Message
230 B
39 B
3.1 KB
466 B
Extensible user profiles for Django

This is an extensible user profile system for Django, designed to provide a 
simple user Profile model that is extensible.

The concept (and some code) is borrowed from the FeinCMS 
( page model.

To use the profiles module add profiles to your INSTALLED_APPS.

Before proceeding with syncdb, you must add some profile extensions. 
The profiles module does not add anything to the User model by default.

Profile extension modules

Extensions are a way to add often-used functionality the Profile model. The 
extensions are standard python modules with a register() method which will be 
called upon registering the extension. The register() method receives the 
Profile class itself and the model admin class ProfileAdmin as arguments. 

The extensions can be activated by adding the following to a file that will be processed anyway:

    from profiles.models import Profile
    Profile.register_extensions('title', 'picture', 'address', 'profiles.modules.options.extensions.options') 

If the extension requires it's own models (like the options extension) then 
the app containing the models will also need to be added to your INSTALLED_APPS.

Adding extensions

To add an extension create a python module that defines a register function 
that accepts the Profile class and the ProfileAdmin class as arguments and 
modifies them as required.

Here is the address extension (profiles/extensions/

    from django.db import models
    from django.utils.translation import ugettext_lazy as _

    def register(cls, admin_cls):
        cls.add_to_class('address1', models.CharField(max_length=255, verbose_name=_('address'), null=True, blank=True))
        cls.add_to_class('address2', models.CharField(max_length=255, verbose_name=_('address 2'), null=True, blank=True))
        cls.add_to_class('city', models.CharField(max_length=255, verbose_name=_('town/city'), null=True, blank=True))
        cls.add_to_class('region', models.CharField(max_length=255, verbose_name=_('county/state/province'), null=True, blank=True))
        cls.add_to_class('postcode', models.CharField(max_length=15, verbose_name=_('postcode'), null=True))
        cls.add_to_class('country', models.ForeignKey('countries.Country', null=True, blank=True))
        cls.add_to_class('telephone', models.CharField(max_length=32, verbose_name=_('mobile number'), null=True, blank=True))

        if admin_cls:
            admin_cls.search_fields += ['address1', 'address2', 'city', 'region', 'postcode']
            admin_cls.list_display_filter += ['country', ]

            if admin_cls.fieldsets:
                admin_cls.fieldsets.append((_('Address'), {
                        'fields': ['address1', 'address2','city', 'region', 'postcode', 'country', 'telephone'],
                        'classes': ('collapse',),

Add 'incuna.countries' to INSTALLED_APPS for using address extension.
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.