python - 如何利用 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.
我真的不知道这里发生了什么。
所以我希望不会出错,就像用户字段一样。相反,我得到了这个错误。任何帮助将不胜感激 :)
解决方案
您的代码正在为和字段OneToOne
的User
模型设置 a 。所以这意味着相关领域将适用于两者。要指定要映射到您需要设置user
first_name
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
您还需要设置信号以在创建/更新UserProfileInfo
时User
创建/更新。看看这篇文章。
还有其他方法可以User
在 Django 中扩展模型。查看本文或此答案以获取建议。
但是,如果您不向User
模型添加任何额外的字段,那么直接使用它可能会更好。
推荐阅读
- python - numpy矢量化方法来计算整数数组中的非零位
- c++ - C++ Mapping strings to enums - string compare vs. map - performance optimization
- xml - Replace PATH element with SED of multiple xml file in bash
- flutter - jQuery.param in Dart
- android - Flutter video_player unable to play a few videos from file
- jenkins - Jenkinsfile: how to checkout multiple branch sources in multibranch pipeline?
- c# - 服务器端 Blazor 中的构造函数外部的依赖注入
- python - django 提出的“函数”对象不可下标,但本地 python 不能
- sql - PySpark 将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围
- python - DateTime 范围为“长格式”,具有精确的 15 分钟(“点钟季度”)间隔和持续时间?