django-registration自动创建UserProfile

rab*_*bid 9 django profile django-registration

我正在使用django-registration,我正在尝试连接其信号以自动创建UserProfile.

信号定义:

from django.dispatch import Signal

# A new user has registered.
user_registered = Signal(providing_args=["user", "request"])
Run Code Online (Sandbox Code Playgroud)

信号由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
Run Code Online (Sandbox Code Playgroud)

我的信号连接:

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)
Run Code Online (Sandbox Code Playgroud)

不用说,没有创建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)
Run Code Online (Sandbox Code Playgroud)

我正在使用Pycharm进行调试,并且在一开始我的user_registered.connect()断点就被命中了.所以我假设connect()正在正确注册.但是,我仍然没有看到createUserProfile正在运行.还有什么我想念的吗?

谢谢!

答案: Doh.我的连接和接收器代码错了.正确的代码:

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

user_registered.connect(createUserProfile)
Run Code Online (Sandbox Code Playgroud)

我在django-registration中读取signals.py后意识到了这一点

Tor*_*cht 7

您需要在服务器启动时导入的模块中注册(连接)您的信号.user_registered.connect(createUserProfile, sender=User)生命可能不会在启动时导入的文件.来自django文档:

您可以将信号处理和注册码放在任何您喜欢的地方.但是,您需要确保早期导入模块,以便在需要发送任何信号之前注册信号处理.这使您的应用程序的models.py成为放置信号处理程序注册的好地方.

http://docs.djangoproject.com/en/dev/topics/signals/#connecting-receiver-functions

所以你的自定义应用程序的models.py将是一个好地方(或任何其他模块,肯定是在服务器启动时导入).