开发者

django user profile database problem

开发者 https://www.devze.com 2023-02-16 15:54 出处:网络
I have app called aaa and in models.py in aaa i have sth like: from django.db import models from django.contrib.auth.models import User

I have app called aaa and in models.py in aaa i have sth like:

from django.db import models
from django.contrib.auth.models import User

class BBB(models.Model):
    user = models.OneToOneField(User)
    newsletter=models.BooleanField(default=False)

I add to my setting.py

AUTH_PROFILE_MODULE = 'aaa.BBB'

then i go to django shell and type

>>> from django.contrib.auth.models import User
>>> a=User.objects.get(id=1)
>>> a.get_profile()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/contrib/auth/models.py", line 373, in get_profile
    self._profile_cache = model._default_manager.using(self._state.db).get(user__id__exact=self.id)
  File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/db/models/query.py", line 347, in get
    % self.model._meta.object_name)
DoesNotExist: BBB matching query d开发者_运维知识库oes not exist.

Some body have idea what is wrong? Edit: I do manage.py syncdb


http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

The method get_profile() does not create the profile, if it does not exist. You need to register a handler for the signal django.db.models.signals.post_save on the User model, and, in the handler, if created=True, create the associated user profile.

The signal they mention is not really documented django-style where they provide code examples, so I will create an example for you:

from django.db.models import signals
from django.contrib.auth.models import User

def create_userprofile(sender, **kwargs):
    created = kwargs['created'] # object created or just saved?

    if created:
        BBB.objects.create(user=kwargs['instance'])  # instance is the user
        # create a BBB "profile" for your user upon creation.
        # now every time a user is created, a BBB profile will exist too.
        # user.BBB or user.get_profile() will always return something

signals.post_save.connect(create_userprofile, sender=User)


That's ok, everything works. DoesNotExist: BBB matching query does not exist. means there is no BBB (user profile) for this user (matching query, i.e. get me the user profile for this user).

Use the DoesNotExist exception to assert whether a particular user has an associated user profile. When you create a BBB instance which is related to user a, you won't get a DoesNotExist exception.

0

精彩评论

暂无评论...
验证码 换一张
取 消