我正在使用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正在运行。我还缺少什么?
谢谢!
答案: Doh。我的连接和接收器代码错了。正确的代码:
def createUserProfile(sender, user, request, **kwargs):
UserProfile.objects.get_or_create(user=user)
user_registered.connect(createUserProfile)
在读取django-registration
中的signals.py后实现了它答案 0 :(得分:7)
您需要在服务器启动时导入的模块中注册(连接)您的信号。您user_registered.connect(createUserProfile, sender=User)
生活的文件可能不会在启动时导入。来自django docs:
你可以把信号处理和 注册码随时随地。 但是,您需要确保这一点 它所在的模块很早就被导入了 因此,信号处理得到 在任何信号需要之前注册 被发送。这使你的应用程序 models.py是个好地方 注册信号处理程序。
http://docs.djangoproject.com/en/dev/topics/signals/#connecting-receiver-functions
因此,自定义应用程序的models.py将是一个好地方(或者在服务器启动时明确导入的任何其他模块)。
答案 1 :(得分:3)
Torsten是对的:另一种方法是使用decorators中所述的documentation:
from registration.signals import user_registered
# ...
@receiver(user_registered)
def your_function_name_here(sender, user, request, **kwargs):
# your code here
pass
我喜欢这种方式,因为它紧凑且易读。