首页 > 解决方案 > 如何利用 Django 用户模型的内置名字和姓氏功能?

问题描述

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

所以我在models.py文件中有一个first_name和last_name字段,它们是CharFields。我想知道如何将它们连接到 Django 附带的现有用户窗体。

我已经尝试了一些事情,例如使用 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_name 属性,并且在 models.py 文件中,我将 first_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.

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

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

标签: pythondjangodjango-modelsdjango-formsdjango-templates

解决方案


您的代码正在为和字段OneToOneUser模型设置 a 。所以这意味着相关领域将适用于两者。要指定要映射到您需要设置userfirst_nameUser.idUserProfileInfo.first_nameUser.first_nameto_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

您还需要设置信号以在创建/更新UserProfileInfoUser创建/更新。看看这篇文章

还有其他方法可以User在 Django 中扩展模型。查看本文此答案以获取建议。

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


推荐阅读