У меня расширенная модель UserProfile в django:
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
#other things in that profile
И сигналы.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.
Структура важных приложений для этого такова, что у меня есть одно приложение под названием «пользователи», там у меня есть: models.py, signal.py, urls.py и views.py (и некоторые другие вещи, которые не должны ' не имеет значения здесь). Класс UserProfile определен в models.py.
Обновление : Я изменил signal.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:
Я нашел это. Похоже, я как-то зарегистрировал сигнал дважды. Обходной путь для этого описан здесь: http://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave
Мне пришлось добавить dispatch_uid, теперь мой signal.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")