django用户档案数据库问题

Joh*_*ohn 3 django django-authentication

我有一个名为aaa的应用程序,在aaa的models.py中,我喜欢:

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)
Run Code Online (Sandbox Code Playgroud)

我添加到我的setting.py

AUTH_PROFILE_MODULE = 'aaa.BBB'
Run Code Online (Sandbox Code Playgroud)

然后我去django shell并输入

>>> 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.
Run Code Online (Sandbox Code Playgroud)

有些人有想法有什么不对吗?编辑:我做manage.py syncdb

Yuj*_*ita 7

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

如果配置文件不存在,则get_profile()方法不会创建配置文件.您需要在User模型上为信号django.db.models.signals.post_save注册处理程序,并且在处理程序中,如果created = 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)
Run Code Online (Sandbox Code Playgroud)

  • 将它放在BBB模型下面,因为信号处理程序会立即关注它.如果你的`models.py`模块过于拥挤或者你想将你的应用程序组件分开,你可以把它放在同一个应用程序中的`signals.py`模块中(一种不言而喻的规则). (3认同)