如何解决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,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,**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,**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
我喜欢这种方式,因为它紧凑且可读。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。