gpt4 book ai didi

django-registration 自动创建用户配置文件

转载 作者:行者123 更新时间:2023-12-04 03:54:30 26 4
gpt4 key购买 nike

我正在使用 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 文档:

You can put signal handling and registration code anywhere you like. However, you'll need to make sure that the module it's in gets imported early on so that the signal handling gets registered before any signals need to be sent. This makes your app's models.py a good place to put registration of signal handlers.



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

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

关于django-registration 自动创建用户配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5658745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com