【问题标题】:django-registration creating blank django-profiles using signalsdjango-registration 使用信号创建空白 django-profiles
【发布时间】:2011-06-04 15:51:48
【问题描述】:

我已经通过here 和Shacker 的django-profiles: The Missing Manual 和后续信号解决方案Dmitko 和答案here 和许多地方。

以下是详细信息:

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 正在向用户注册页面添加字段,但在保存时,它正在创建一个用户对象,其用户名和电子邮件地址但在用户对象和配置文件对象中的名字和姓氏都没有保存。但是,会使用空白字段创建空白配置文件。我一定是遗漏了一些小东西,但我似乎看不到它。

因此信号正常,但数据未保存到配置文件中。

老实说,我们心爱的 Django 中的这个解决方案应该集中在一个地方,并且将最佳实践放在一起以方便使用。

帮助。

【问题讨论】:

    标签: django django-signals django-registration django-profiles


    【解决方案1】:

    您的Member 模型在哪里定义?我什至看不到它正在为您的ProfileForm 导入。您是否将ProfileFormUserRegistrationForm 放在同一页面上?

    如果用户同时填写了这两个表格(甚至填写了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()
    

    【讨论】:

    • 嗨卢克,我编辑错误。编辑了条目。我删除了 UserRegistrationForm 和 signals.post_save.connect(..),现在我没有得到空白配置文件。
    • 正在创建一个新用户,但没有保存任何扩展数据的空白配置文件。似乎保存功能没有保存数据。可能出了什么问题?
    猜你喜欢
    • 2013-05-21
    • 2011-12-15
    • 2013-07-12
    • 1970-01-01
    • 2011-04-15
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多