【问题标题】:In Django Extending User Form for Custom User在 Django 中为自定义用户扩展用户表单
【发布时间】:2011-12-09 06:39:29
【问题描述】:

我按照此 SO Posting 中的描述扩展了我的用户模型: Extending the User model with custom fields in Django

但是,我正在尝试创建用户创建表单,但得到以下信息:

“成员”对象没有属性“set_password”

这是我的模型表格:

class Members(models.Model):
    user = models.OneToOneField(User)

GENDER_CHOICES = ( ... )
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
date_of_birth     = models.DateField()
class Meta:
    db_table='members'

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Members.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

....还有我的表格....

class SignUpForm(UserCreationForm):
    GENDER_CHOICES = ( ... )
    email = forms.EmailField(label='Email address', max_length=75)
    first_name   = forms.CharField(label='First Name')
    last_name    = forms.CharField(label='Last Name')
    gender  = forms.ChoiceField(widget=RadioSelect, choices=GENDER_CHOICES)
    date_of_birth = forms.DateField(initial=datetime.date.today)

    class Meta:
        model = Members
        fields = ('username', 'email','first_name', 'last_name')

我是 Django 的新手,在此先感谢

【问题讨论】:

    标签: python django


    【解决方案1】:

    您选择扩展User 模型的方法是创建UserProfile(您将其称为Member)。 Member不是User 的子类,因此您不能在其上调用User 方法(如set_password)。

    相反,您的 SignUpForm 的 Meta 模型应该仍然是 User,并且要获取扩展的 UserProfile,您应该调用 user.get_profile()。例如,要获取用户的性别,您可以调用user.get_profile().gender

    阅读https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users 了解有关扩展用户配置文件的更多信息。

    【讨论】:

    • 感谢您的回复。我是否覆盖表单对象的保存参数,然后 user.get_profile() 保存新的用户配置文件对象? (我将 Member 重命名为 UserProfile)
    • 有一个SO question 可以帮助你。该解决方案让您覆盖save()。我从来没有写过任何必须使用 UserProfile 的东西(我所有的项目都扩展了 User 类),所以恐怕我不能帮助你太多。
    • 请注意 get_profile 自 django 1.5 以来已被弃用并在 1.7 中删除
    猜你喜欢
    • 2019-09-11
    • 2013-04-18
    • 2017-02-01
    • 1970-01-01
    • 2011-08-08
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多