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一致するクエリが存在しません」というエラーが表示されます。これは、データベースエントリが存在しないことを意味します。
user_registeredシグナルを提供するdjango-registrationを使用していると言えます。
このための重要なアプリの構造は、「users」と呼ばれる1つのアプリケーションがあり、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:
見つけた。どういうわけか私は信号を2回登録したようです。これの回避策はここで説明されています: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")