Opened 16 years ago
Last modified 13 years ago
#9992 closed
get_profile / get_model issue, capitalisation of AUTH_PROFILE_MODULE — at Version 1
Reported by: | anonymous | Owned by: | nobody |
---|---|---|---|
Component: | Documentation | Version: | 1.0 |
Severity: | Keywords: | ||
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Full email discussion from: http://groups.google.com/group/django-users/browse_thread/thread/493e0c048dd07e46/bf8a13a685d81c75?lnk=gst&q=get_profile#bf8a13a685d81c75
The link to the faulty documentation is given at the very end of this entry.
Dear all,
I have difficulties with the get_profile
to link my Profile
class with
the inbuilt User object.
The error message (which can be obtained through the 'chatroom' view
shown below, or via the shell) is:
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) /Users/fangohr/local/hg/scico_web/debug/mysite/<ipython console> in <module>() /Library/Frameworks/Python.framework/Versions/4.0.30002/lib/python2.5/site-packages/django/contrib/auth/models.pyc in get_profile(self) 291 app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.') 292 model = models.get_model(app_label, model_name) --> 293 self._profile_cache = model._default_manager.get(user__id__exact=self.id) 294 except (ImportError, ImproperlyConfigured): 295 raise SiteProfileNotAvailable AttributeError: 'NoneType' object has no attribute '_default_manager'
This indicates that models.get_model()
does return None
, but I don't know why.
I have in settings.py
:
AUTH_PROFILE_MODULE = 'people.profile'
which I believe is the right entry.
For clarity, I have created a small django-site that can be downloaded in a tar file as:
http://www.soton.ac.uk/~fangohr/geheim/django/get_profile/debug.tar.gz
or can be viewed online in the untarred version at
http://www.soton.ac.uk/~fangohr/geheim/django/get_profile/debug
I summarise the most important elements below (so that this email can stand on its own for the archives):
mysite/People/models.py
contains:
#----------- from django.contrib.auth.models import User from django.db import models class Profile(models.Model): user = models.ForeignKey(User,unique=True) homepageURL=models.URLField('homepage',blank=True) class Admin: pass #-----------
The corresponding view (which fails) is in mysite/People/views.py
:
#----------- from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required def chatrooms(request): u = User.objects.get(pk=1) # Get the first user user_address = u.get_profile().homepageURL #at this point we get an error, equivalent to shell example #-----------
The mysite/settings.py
reads
#----------- # Django settings for mysite project. DEBUG = True TEMPLATE_DEBUG = DEBUG ADMINS = ( # ('Your Name', 'your_email@domain.com'), ) MANAGERS = ADMINS DATABASE_ENGINE = 'sqlite3' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. DATABASE_NAME = 'test.dat' # Or path to database file if using sqlite3. DATABASE_USER = '' # Not used with sqlite3. DATABASE_PASSWORD = '' # Not used with sqlite3. DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. # Local time zone for this installation. Choices can be found here: # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name # although not all choices may be available on all operating systems. # If running in a Windows environment this must be set to the same as your # system time zone. TIME_ZONE = 'America/Chicago' # Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html LANGUAGE_CODE = 'en-us' SITE_ID = 1 # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. USE_I18N = True # Absolute path to the directory that holds media. # Example: "/home/media/media.lawrence.com/" MEDIA_ROOT = '' # URL that handles the media served from MEDIA_ROOT. Make sure to use a # trailing slash if there is a path component (optional in other cases). # Examples: "http://media.lawrence.com", "http://example.com/media/" MEDIA_URL = '' # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a # trailing slash. # Examples: "http://foo.com/media/", "/media/". ADMIN_MEDIA_PREFIX = '/media/' AUTH_PROFILE_MODULE = 'people.profile' # Make this unique, and don't share it with anybody. SECRET_KEY = 'afxb6gs$x!8o3z5+bc@4#g0^z_mpuscs1=#c700@cdpvn^&51@' # List of callables that know how to import templates from various sources. TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.load_template_source', 'django.template.loaders.app_directories.load_template_source', # 'django.template.loaders.eggs.load_template_source', ) MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ) ROOT_URLCONF = 'mysite.urls' #ROOT_URLCONF = 'urls' TEMPLATE_DIRS = ( # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ) INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'mysite.People', 'django.contrib.admin' ) #------------
and the url.py
is
#------------ from django.conf.urls.defaults import * import mysite from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', (r'^mysite/$', 'mysite.People.views.chatrooms'), (r'^admin/(.*)', admin.site.root), ) #------------
The error can be triggered by viewing
http://localhost:8000/mysite/
or by running the shell example shown here:
phi:mysite fangohr$ python manage.py shell Enthought Python Distribution -- http://code.enthought.com Python 2.5.2 |EPD with Py2.5 4.0.30002 | (r252:60911, Oct 15 2008, 16:58:38) Type "copyright", "credits" or "license" for more information. IPython 0.9.1 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object'. ?object also works, ?? prints more. In [1]: from django.contrib.auth.models import User In [2]: myuser=User.objects.all()[0] In [3]: myuser.get_profile() --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) /Users/fangohr/local/hg/scico_web/debug/mysite/<ipython console> in <module>() /Library/Frameworks/Python.framework/Versions/4.0.30002/lib/python2.5/site-packages/django/contrib/auth/models.pyc in get_profile(self) 291 app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.') 292 model = models.get_model(app_label, model_name) --> 293 self._profile_cache = model._default_manager.get(user__id__exact=self.id) 294 except (ImportError, ImproperlyConfigured): 295 raise SiteProfileNotAvailable AttributeError: 'NoneType' object has no attribute '_default_manager' In [4]:
I have checked other entries on the mailing list, but couldn't find the solution to this problem.
Any help is very welcome.
Many thanks,
Hans
PS Version:
phi:mysite fangohr$ python manage.py --version 1.0.2 final
PPS In the database for this example, the admin user is 'admin' and
the password is 'admin' -- in case anybody wants to play with that.
Solution (Karen Tracey):
(Thanks for the very detailed question.) I think you have found a
documentation bug. I do not believe the'people'
part of that
should be normalized to lower case. It is not normalized to lower
case inINSTALLED_APPS
, and I don't think it should be normalized
to lower case here. Since you have a capital P in People for your
directory name, try'People.profile'
.
Karen
Note: Changing people.profile
to People.profile
solves the problem.
Related documentation: http://docs.djangoproject.com/en/dev/topics/auth/#auth-profiles
Here it says under 1.: "The (normalized to lower-case) name of the application in which the user profile model is defined (in other words, an all-lowercase version of the name which was passed to manage.py startapp
to create the application)."
This is wrong.
Tar file of complete Django site to demonstrate the problem.