如何利用Django用户模型内置的名字和姓氏特性?

2024-06-28 20:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我知道Django有一个内置的用户系统,它包含用户名、电子邮件、密码、名字和姓氏。我想知道如何在我的网站上利用这个

所以我在models.py文件中有一个first\u name和last\u name字段,它们是charfield。我想知道如何将它们连接到Django附带的已经存在的UserForm

我已经尝试了一些方法,比如使用models.py文件

class UserProfileInfo(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.OneToOneField(User, on_delete=models.CASCADE)

下面是form.py文件的一些代码

class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())

    class Meta():
        model = User
        fields = ('username','email','password','first_name')

从表单中可以看到,我添加了first\u name属性,在models.py文件中,我将first\u name与forms.py连接起来。我现在得到这个错误

HINT: Add or change a related_name argument to the definition for 'UserProfileInfo.user' or 'UserProfileInfo.first_name'.

因此,我在模型中添加了一个相关的名称字段,如下所示

first_name = models.OneToOneField(User, on_delete=models.CASCADE,related_name='first_name') 

但是,你不知道吗,我又犯了一个错误:

ValueError: Cannot assign "''": "User.first_name" must be a "UserProfileInfo" instance.

我真的不知道这里发生了什么

所以我希望不会出现错误,就像用户字段一样。相反,我犯了这个错误。任何帮助都将不胜感激:)


Tags: 文件djangonamepyonmodels错误forms
1条回答
网友
1楼 · 发布于 2024-06-28 20:25:24

您的代码正在为userfirst_name字段的OneToOne模型设置User。所以这意味着相关字段将是User.id。 要指定要UserProfileInfo.first_name映射到User.first_name,需要设置to_field=first_name

class UserProfileInfo(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.OneToOneField(User, on_delete=models.CASCADE, to_field='first_name', related_name='user_profile_first_name')

但是,这仍然会导致问题,因为您只能将OneToOne关系设置为唯一字段。因为User.first_name不是唯一的,所以不能为它设置OneToOne关系

如果两个OneToOne关系都引用同一个对象,那么其中一个关系是多余的,因为您可以通过另一个关系访问该对象上的字段。最好在UserProfileInfo上有一个通过user字段获取名字的方法

class UserProfileInfo(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def get_first_name(self):
        return user.first_name

User被创建/更新时,您还需要设置创建/更新UserProfileInfo的信号。看看this article

还有其他方法可以扩展Django中的User模型。查看this articlethis answer以获得建议

但是,如果不向User模型添加任何额外字段,直接使用它可能更好

相关问题 更多 >