django-registration自动创建UserProfile

| 我正在使用django-registration,并且尝试连接到其信号以自动创建UserProfile。 信号定义:
from django.dispatch import Signal

# A new user has registered.
user_registered = Signal(providing_args=[\"user\", \"request\"])
django-registration发送的信号:
    def register(self, request, **kwargs):
    \"\"\"
    Create and immediately log in a new user.

    \"\"\"
    username, email, password = kwargs[\'username\'], kwargs[\'email\'], kwargs[\'password1\']
    User.objects.create_user(username, email, password)

    # authenticate() always has to be called before login(), and
    # will return the user we just created.
    new_user = authenticate(username=username, password=password)
    login(request, new_user)
    signals.user_registered.send(sender=self.__class__,
                                 user=new_user,
                                 request=request)
    return new_user
我的信号连接:
from registration.signals import *
from core.models import UserProfile
from django.contrib.auth.models import User

def createUserProfile(sender, instance, **kwargs):
    UserProfile.objects.get_or_create(user=instance)

user_registered.connect(createUserProfile, sender=User)
不用说,没有创建UserProfile。我在这里想念什么? 非常感谢! 编辑:我将我的connect()及其对应的方法移到了model.py,仍然没有运气。 新代码:
from django.db import models

from django.contrib import auth
from django.contrib.auth import login
from core.forms import AuthForm
from registration.signals import *
from django.contrib.auth.models import User


# Create your models here.

class UserProfile(models.Model) :
    user = models.ForeignKey(User, unique=True)

    def __unicode__(self):
        return self.user.username


def createUserProfile(sender, instance, **kwargs):
    print \"creating profile\"
    UserProfile.objects.get_or_create(user=instance)

user_registered.connect(createUserProfile, sender=User)
我正在使用Pycharm进行调试,从一开始我的user_registered.connect()断点就被击中。因此,我假设connect()已正确注册。但是,我仍然看不到createUserProfile正在运行。我还有什么想念的吗? 谢谢! 答案:哦。我的连接和接收器代码错误。正确的代码:
def createUserProfile(sender, user, request, **kwargs):
UserProfile.objects.get_or_create(user=user)

user_registered.connect(createUserProfile)
我在django-registration中读取signals.py后实现了它     
已邀请:
您需要在服务器启动时导入的模块中注册(连接)信号。
user_registered.connect(createUserProfile, sender=User)
所在的文件可能未在启动时导入。从Django文档中:   您可以将信号处理和   您喜欢的任何地方的注册码。   但是,您需要确保   它所在的模块会尽早导入   以便信号处理   在任何信号需要之前注册   被发送。这使您的应用   models.py一个放置的好地方   信号处理程序的注册。 http://docs.djangoproject.com/en/dev/topics/signals/#connecting-receiver-functions 因此,自定义应用程序的models.py将是一个不错的选择(或在服务器启动时绝对导入的任何其他模块)。     
Torsten是正确的:替代方法是使用文档中所述的装饰器:
    from registration.signals import user_registered
    # ...
    @receiver(user_registered)
    def your_function_name_here(sender, user, request, **kwargs):
            # your code here
            pass
我喜欢这种方式,因为它紧凑且可读。     

要回复问题请先登录注册