我在Django中有一个扩展的UserProfile模型:
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
#other things in that profile
还有一个signals.py:
from registration.signals import user_registered
from models import UserProfile
from django.contrib.auth.models import User
def createUserProfile(sender, instance, **kwargs):
profile = users.models.UserProfile()
profile.setUser(sender)
profile.save()
user_registered.connect(createUserProfile, sender=User)
我通过在__init__.py
中加入以下代码来确保信号被注册:
import signals
那么这应该为每个注册的用户创建一个新的UserProfile,对吧?但事实并非如此。每当我尝试登录时,我总是会收到“UserProfile匹配查询不存在”的错误,这意味着数据库条目不存在。
我应该说明一下,我使用django-registration,它提供了user_registered信号。
对于这个问题,重要的应用程序结构是,我有一个名为“users”的应用程序,在那里我有:models.py、signals.py、urls.py和views.py(以及其他一些在这里不重要的东西)。UserProfile类在models.py中定义。
更新:我将signals.py更改为:
from django.db.models.signals import post_save
from models import UserProfile
from django.contrib.auth.models import User
def create_profile(sender, **kw):
user = kw["instance"]
if kw["created"]:
profile = UserProfile()
profile.user = user
profile.save()
post_save.connect(create_profile, sender=User)
但是现在我遇到了一个"完整性错误(IntegrityError)":
"列user_id不是唯一的"
编辑2:
我找到原因了。看起来我以某种方式注册了两次信号(signal)。这个问题的解决方法在这里描述: http://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave
我需要添加一个dispatch_uid,现在我的signals.py看起来像这样并且能够正常工作:
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from models import UserProfile
from django.db import models
def create_profile(sender, **kw):
user = kw["instance"]
if kw["created"]:
profile = UserProfile(user=user)
profile.save()
post_save.connect(create_profile, sender=User, dispatch_uid="users-profilecreation-signal")
profile=user.models.UserProfile()
很好奇 - 你有一个名为'user'的模块吗?UserProfile()在哪里? - czarchaic