【问题标题】:django-registration auto create UserProfiledjango-registration 自动创建用户配置文件
【发布时间】:2011-08-05 06:00:07
【问题描述】:

我正在使用 django-registration 并尝试连接到它的信号以自动创建用户配置文件。

信号定义:

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)

不用说没有创建用户配置文件。我在这里错过了什么?

非常感谢!

编辑:我将 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 后才意识到

【问题讨论】:

    标签: django profile django-registration


    【解决方案1】:

    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
    

    我喜欢这种方式,因为它简洁易读。

    【讨论】:

      【解决方案2】:

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

      你可以把信号处理和 您喜欢的任何地方的注册码。 但是,您需要确保 它所在的模块会提前导入 on 以便信号处理得到 在任何信号需要之前注册 被发送。这使您的应用程序的 models.py 是一个放置的好地方 信号处理程序的注册。

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

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

      【讨论】:

      • 我根据您的回答更改了我的代码,但仍然没有运气。请检查我的编辑。非常感谢!
      猜你喜欢
      • 1970-01-01
      • 2012-11-19
      • 2016-12-03
      • 1970-01-01
      • 2017-02-18
      • 2011-04-15
      • 2012-08-02
      • 2012-07-14
      • 2013-04-05
      相关资源
      最近更新 更多