在Django中扩展用户表单以自定义用户

2 投票
1 回答
5534 浏览
提问于 2025-04-17 08:01

我按照这个StackOverflow的帖子扩展了我的用户模型:在Django中用自定义字段扩展用户模型

不过,我在创建用户注册表单时遇到了一个问题,出现了这个错误:

'Members'对象没有'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,所以提前谢谢大家的帮助

1 个回答

2

你选择的方式来扩展你的 User 模型是创建一个 UserProfile(你叫它 Member)。但是,Member 其实并不是 User 的子类,所以你不能直接在 Member 上调用 User 的方法,比如 set_password

相反,你的 SignUpForm 的 Meta 模型应该还是 User,如果想要获取扩展的用户资料,你需要调用 user.get_profile()。比如,要获取用户的性别,你可以使用 user.get_profile().gender

想了解更多关于扩展用户资料的信息,可以查看 这篇文档

撰写回答