django-регистрация автоматически создает UserProfile - PullRequest
8 голосов
/ 14 апреля 2011

Я использую django-регистрацию и пытаюсь подключиться к ее сигналам, чтобы автоматически создать UserProfile.

Определение сигнала:

from django.dispatch import Signal

# A new user has registered.
user_registered = Signal(providing_args=["user", "request"])

Сигнал при регистрации django:

    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. Что-то еще мне не хватает?

Спасибо!

ОТВЕТ: Doh. Мой код подключения и получения был неверным. Правильный код:

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

user_registered.connect(createUserProfile)

Понял это после того, как я прочитал сигналы.py в django-регистрации

Ответы [ 2 ]

7 голосов
/ 14 апреля 2011

Вам необходимо зарегистрировать (подключить) ваш сигнал в модуле, который импортируется при запуске сервера. Ваш файл, в котором находится user_registered.connect(createUserProfile, sender=User), скорее всего, не импортируется при запуске. Из документации Django:

Вы можете поставить обработку сигналов и регистрационный код где угодно. Тем не менее, вам нужно убедиться, что модуль в котором он импортируется рано на так что обработка сигнала получает зарегистрирован, прежде чем какие-либо сигналы должны быть отправлено. Это делает ваше приложение models.py хорошее место для размещения регистрация обработчиков сигналов.

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

Так что models.py вашего пользовательского приложения будет хорошим местом (или любым другим модулем, который определенно импортируется при запуске сервера).

3 голосов
/ 30 октября 2012

Торстен прав: альтернативный способ - использовать декораторы , как указано в документации :

    from registration.signals import user_registered
    # ...
    @receiver(user_registered)
    def your_function_name_here(sender, user, request, **kwargs):
            # your code here
            pass

Мне нравится этот способ, потому что он компактен и удобочитаем.

...