проблема с базой данных профиля пользователя django - PullRequest
3 голосов
/ 11 марта 2011

У меня есть приложение под названием aaa и в models.py в aaa у меня есть что-то вроде:

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)

Я добавляю к своему setting.py

AUTH_PROFILE_MODULE = 'aaa.BBB'

, затем я иду в Djangoshell и наберите

>>> 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 does not exist.

Некоторые тела имеют представление о том, что не так?Изменить: я управляю.py syncdb

Ответы [ 2 ]

7 голосов
/ 11 марта 2011

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

Метод get_profile () не создает профиль, если он не существует.Вам необходимо зарегистрировать обработчик для сигнала django.db.models.signals.post_save в модели User и в обработчике, если он создан = True, создать связанный профиль пользователя.

Сигнал, который они упоминают, на самом деле не документирован в стиле django, где они предоставляют примеры кода, поэтому я создам пример для вас:

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)
1 голос
/ 11 марта 2011

Все нормально, все работает.DoesNotExist: BBB matching query does not exist. означает для этого пользователя нет BBB (профиль пользователя) (соответствующий запрос, т.е. получите мне профиль пользователя для этого пользователя) .

Используйте исключение DoesNotExist для подтвержденияесть ли у конкретного пользователя связанный профиль пользователя.Когда вы создаете экземпляр BBB, связанный с пользователем a, вы не получите исключение DoesNotExist.

...