python - 如何在 Django 中将现有模型与用户模型链接
问题描述
我认为这是一个非常简单的问题,但我是 Django 新手,正在寻找最佳/正确的做事方式。如果我问愚蠢的问题,请原谅我。
我的 Django 应用程序中有一个名为 Person 的模型。它仅包含一个人的基本信息,尚未涉及个人数据:
class Person(models.Model):
birthday = models.DateField(null=True)
gender = models.CharField(max_length=10)
height = models.CharField(max_length=3)
weight = models.CharField(max_length=3)
现在我还想为这个人添加一个注册和登录的功能。这样做的正确方法是什么?许多教程似乎建议使用该forms.py
文件,例如:
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class RegisterForm(UserCreationForm):
birthdate = forms.DateField()
discord_id = forms.CharField(max_length=100, help_text='Discord ID')
zoom_id = forms.CharField(max_length=100, help_text='Zoom ID')
class Meta:
model = User
fields = ["username", "password1", "password2", "birthdate", "email", "discord_id", "zoom_id"]
我将如何使用/链接我现有的 Person 模型与这个内置的 User 模型?还是我需要一个单独的模型Models.py
?我是否只是像上面那样创建用户模型forms.py
并将我的自定义字段添加到其中?
解决方案
您可以参考 django 文档来扩展用户模型:
https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#extending-the-existing-user-model
有两种方法。您可以将模型与 django 用户模型建立 OneToOne 关系以添加其他字段。或者您可以从 django 扩展抽象用户模型以创建自定义用户。
from django.contrib.auth.models import AbstractUser
class Person(AbstractUser):
birthday = models.DateField(null=True)
gender = models.CharField(max_length=10)
height = models.CharField(max_length=3)
weight = models.CharField(max_length=3)
您还需要在设置中标记自定义用户:
AUTH_USER_MODEL = 'myapp.Person'
然后该模型可以以下列形式使用:
from django.contrib.auth.forms import UserCreationForm
from .models import Person
class RegisterForm(UserCreationForm):
birthdate = forms.DateField()
discord_id = forms.CharField(max_length=100, help_text='Discord ID')
zoom_id = forms.CharField(max_length=100, help_text='Zoom ID')
class Meta:
model = Person
fields = ["username", "password1", "password2", "birthdate", "email", "discord_id", "zoom_id"]
或者,您可以执行 OneToOne 关系:
from django.contrib.auth.models import User
class Person(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
birthday = models.DateField(null=True)
gender = models.CharField(max_length=10)
height = models.CharField(max_length=3)
weight = models.CharField(max_length=3)
推荐阅读
- python - 使用python看不到矩阵图的结果
- cordova - 在 android 9 中发出 ajax 请求时出现 jqXHR.status === 0 错误
- javascript - 节点 crypto.randomBytes 从函数返回令牌
- action - 提交我的 google action assistant 应用以发布时出错
- php - 如何摆脱2个while循环并继续for循环过程
- javascript - 单击 ag-grid 时自定义过滤器未定义抛出错误
- javascript - 如何循环数据并将其放置在确切的位置。使用 jQuery
- python - 当文本的长度超过 Python 中的窗口大小时,如何打印新行或自动打印新行?
- caching - 如何在同一台机器上运行多个 Apache Ignite 节点?
- cypress - cypress 中的自定义子命令不执行点击