django-регистрация создание пустых django-профилей с использованием сигналов - PullRequest
0 голосов
/ 06 января 2011

Я прошел через решение здесь и django-профили Шекера : Пропавшее руководство и последующее решение по сигналам Дмитко и ответы здесь и много мест.

Вот подробности:

AUTH_PROFILE_MODULE = "members.Profile "

От members.models.py

class Profile(models.Model):
    """member model."""
    GENDER_CHOICES = (
        (1, 'Male'),
        (2, 'Female'),
    )
    user = models.ForeignKey(User, unique=True)
    first_name = models.CharField(_('first name'), max_length=100)
    middle_name = models.CharField(_('middle name'), blank=True, max_length=100)
    last_name = models.CharField(_('last name'), max_length=100)
    slug = models.SlugField(_('slug'), unique=True)
    gender = models.PositiveSmallIntegerField(
        _('gender'), 
        choices=GENDER_CHOICES, 
        blank=True, 
        null=True,
        )
    birth_date = models.DateField(_('birth date'), blank=True, null=True)

    class Meta:
        verbose_name = _('Profiles')
        verbose_name_plural = _('Profiles')
        db_table = 'Profiles'
        ordering = ('last_name', 'first_name',)

от members.forms.py:

from django.contrib.auth.models import User
from basic.members.models import Profile
from registration.forms import RegistrationForm, RegistrationFormTermsOfService, RegistrationFormUniqueEmail
from django.db.models import signals
from basic.members.signals import create_profile

attrs_dict = { 'class': 'required' }

class ProfileForm(RegistrationFormTermsOfService, RegistrationFormUniqueEmail):
    GENDER_CHOICES = (
        (1, 'Male'),
        (2, 'Female'),
    )
    first_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict))
    last_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict))
    gender = forms.IntegerField(widget=forms.RadioSelect(choices=GENDER_CHOICES))
    birth_date = forms.DateField(widget=SelectDateWidget(years=range(1911,1999)))

    def save(self, user):
        try:    
            data = user.get_profile()
        except:
            data = Profile(user=user)
            data.first_name = self.cleaned_data["first_name"]
            data.first_name = self.cleaned_data["last_name"]
            data.save()

class UserRegistrationForm(RegistrationForm):
    first_name = forms.CharField(max_length=100)    
    last_name = forms.CharField(max_length=100)

signals.post_save.connect(create_profile, sender=User)

от members.signals.py:

def create_profile(sender, instance, signal, created, **kwargs):
    """When user is created also create a matching profile."""

    from basic.members.models import Profile

    if created:
        Profile(user = instance).save()

И members.regbackend.py:

def create_profile(sender, instance, signal, created, **kwargs):
    """When user is created also create a matching profile."""

    from basic.members.models import Profile

    if created:
        Profile(user = instance).save()

Я застрял. По сути, моя ProfileForm добавляет поля на страницу регистрации пользователя, но при сохранении создает объект пользователя с именем пользователя и адресом электронной почты, но с именем и фамилией либо в объекте пользователя, ни в объекте профиля не сохраняются. Однако создается пустой профиль с пустыми полями. Я, должно быть, скучаю по чему-то маленькому, но, кажется, не вижу этого.

Таким образом, сигналы работают, но данные не сохраняются в профиле.

Честно говоря, все это решение для нашего любимого Джанго должно быть в одном месте, а лучшие практики собраны для удобства.

Справка.

1 Ответ

0 голосов
/ 06 января 2011

Где определена ваша Member модель?Я даже не вижу, как это импортируется для вашего ProfileForm.Вы помещаете ProfileForm и UserRegistrationForm на одну и ту же страницу?

Если пользователи заполняют обе формы (или даже заполняют ProfileForm), вам не нужен сигнал - в вашемsave() для вашего ProfileForm, просто создайте для вас профиль:

   def save(self, user):
        try:    
            data = user.get_profile()
        except:
            data = Profile(user=user)
            data.first_name = self.cleaned_data["first_name"]
            data.first_name = self.cleaned_data["last_name"]
            data.save()
...