문제

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 매칭 쿼리가 존재하지 않습니다"오류가 발생합니다. 즉, 데이터베이스 항목이 없음을 의미합니다.

user_registered 신호를 제공하는 django- 등록을 사용한다고 말해야합니다.

이를위한 중요한 앱의 구조는 "사용자"라는 응용 프로그램이 하나 있다는 것입니다. Models.py, Signals.py, urls.py 및 Views.py (및 여기서 중요하지 않은 다른 것들이 있습니다. ). userprofile 클래스는 Models.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"를 얻습니다.

"colum user_id는 독특하지 않습니다"

편집 2 :

찾았어요. 어떻게 든 신호를 두 번 등록한 것 같습니다. 이에 대한 해결 방법은 다음과 같습니다. http://code.djangoproject.com/wiki/signals#helppost_saveeseemstobeemittttwiceforeachsave

Dispatch_UID를 추가해야했습니다. 이제 신호가 이렇게 보이고 작동합니다.

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")
도움이 되었습니까?

해결책

사용자에서 post_save를 사용하여 구현할 수 있습니다.

from django.db.models.signals import post_save
from models import UserProfile
from django.contrib.auth.models import User

def create_profile(sender, **kwargs):
    user = kwargs["instance"]
    if kwargs["created"]:
        profile = users.models.UserProfile()
        profile.setUser(sender)
        profile.save()

post_save.connect(create_profile, sender=User)

편집하다:
테스트하고 작동하는 또 다른 가능한 솔루션 (내 사이트에서 사용하고 있습니다) :

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
def create_profile(sender, **kwargs):
    user = kwargs["instance"]
    if kwargs["created"]:
        up = UserProfile(user=user, stuff=1, thing=2)
        up.save()
post_save.connect(create_profile, sender=User)

다른 팁

대신 각 사용자에 대해 처음으로 액세스 할 때 확장 프로필을 만들 수 있습니다.

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    additional_info_field = models.CharField(max_length=50)

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

그런 다음 사용하십시오

from django.contrib.auth.models import User
user = User.objects.get(pk=1)
user.profile.additional_info_field

ref : http://www.codekoala.com/blog/2009/quick-django-tip-user-profiles/

이것은 나를 도왔습니다 : Primary_key = true

class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True, primary_key=True, related_name="user")
    phone = models.CharField(('phone'),max_length=30, blank=False, null=True)
    user_building = models.ManyToManyField(Building, blank=True)
    added_by = models.ForeignKey(User, blank=True, null=True, related_name="added")

전화 할 때 profile.setUser(), 나는 당신이 통과하고 싶다고 생각합니다 instance 보다는 sender 매개 변수로.

로부터 user_registered 신호의 문서화, sender 참조 User 수업; instance 등록 된 실제 사용자 객체입니다.

나의 최신 연구에 따르면, 별도의 파일을 만드는 것, 예를 들어 Singals.py는 작동하지 않습니다.

'create_profile'을 Models.py에서 'post_save'에 'create_profile'을 'post_save'에 직접 연결하는 것이 좋습니다. 그렇지 않으면이 코드가 별도의 파일에 있고 아무도 가져 오지 않기 때문에 실행되지 않습니다.

참조를위한 최종 코드 :

# models.py

# Here goes the definition of class UserProfile.
class UserProfile(models.Model):
    ...

# Use signal to automatically create user profile on user creation.

# Another implementation:
# def create_user_profile(sender, **kwargs):
#     user = kwargs["instance"]
#     if kwargs["created"]:
#         ...
def create_user_profile(sender, instance, created, **kwargs):
    """
    :param sender: Class User.
    :param instance: The user instance.
    """
    if created:
        # Seems the following also works:
        #   UserProfile.objects.create(user=instance)
        # TODO: Which is correct or better?
        profile = UserProfile(user=instance)
        profile.save()

post_save.connect(create_user_profile,
                  sender=User,
                  dispatch_uid="users-profilecreation-signal")

2018 년 업데이트 :

이 질문은 많은 견해를 수집했을 것입니다. 아마도 업데이트의 시간 일 것입니다.

이것은 최신 Django의 최신 버전입니다.

from django.dispatch import receiver
from django.db.models.signals import post_save
from django.conf import settings
from models import UserProfile

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_user_profile(sender, instance=None, created=False, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top