| Info: | Tools for Profile models in Django. |
|---|---|
| Version: | 0.1.0 |
| Author: | Daniel Greenfeld (http://pydanny.com) |
I got tired of cutting and pasting these components from one project to another. So I released django-profiletools.
The lazy loading of profiles was inspired by the rather incredible Noah Kantrowitz.
- Lazy loading of your authenticated profile record across the request object lifetime. That means in the Python code and the templates.
- Name your profile model anything you want in settings.AUTH_PROFILE_MODULE.
Get the code:
pip install django-profiletools
Install the middleware and context_processor in your settings.py:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'profiletools.context_processors.fetch_profile',
)
MIDDLEWARE_CLASSES = (
...
'profiletools.middleware.LazyProfileMiddleware',
)
Also in settings.py, set the AUTH_PROFILE_MODULE to your profile model:
AUTH_PROFILE_MODULE = "profiles.Profile"
Based on that, your profile model should resemble something like:
# profiles.models.Profile.py
from django.contrib.auth.models import User
from django.db import models
class Profile(models.Model):
user = models.OneToOneField(User)
def __unicode__(self):
return self.user.username
note: If you don't use profiles.models.Profile, say members.models.UserProfile go ahead and change the AUTH_PROFILE_MODULE to "members.UserProfile".
In your templates:
{{ request.my_profile }}
In your functional views:
profile = request.my_profile
In your class-based views:
profile = self.request.my_profile
Call my_profile as many times as you want, it only loads once. So if you call it 100 times in a view, the SQL SELECT is only done the first time. If no user is found then the my_profile call result is None, which makes it easier to handle templates which need to be able to handle unauthenticated users (like the about page).
note: If you are using the members.UserProfile example, you'll need to call that by using request.my_userprofile.