如何 link 现有模型与 Django 中的用户模型
How to link an existing model with user model in Django
我认为这是一个非常简单的问题,但我是 Django 的新手,正在寻找 best/correct 做事的方式。如果我问的是愚蠢的问题,请原谅我。
我的 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"]
我如何 use/link 我现有的 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"]
或者你可以建立一对一关系:
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)
有多种方法可以扩展用户模型以根据您的要求添加更多自定义字段 it.They 是代理管理器、OneToOneField、AbstractUser。
我的选择是使用一对一关系字段,因为它将用户绑定到只有一个配置文件。
from django.contrib.auth.models import User
class foo(models.Model):
user = OneToOneField(User, on_delete=models.CASCADE)
此外,您需要有 django 信号才能将扩展的 foo 模型与用户模型绑定。这样无论对 foo 做了什么更改,用户都可以收听它。
from django.db.models.signals import post_save
from django.dispatch import reciever
@reciever(sender=User, post_save)
def create_foo(sender, instance, created, **kwargs):
if created:
foo.objects.create(user=instance)
@reciever(sender=User, post_save)
def save_foo(sender, instance, **kwargs):
instance.foo.save()
我认为这是一个非常简单的问题,但我是 Django 的新手,正在寻找 best/correct 做事的方式。如果我问的是愚蠢的问题,请原谅我。
我的 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"]
我如何 use/link 我现有的 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"]
或者你可以建立一对一关系:
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)
有多种方法可以扩展用户模型以根据您的要求添加更多自定义字段 it.They 是代理管理器、OneToOneField、AbstractUser。 我的选择是使用一对一关系字段,因为它将用户绑定到只有一个配置文件。
from django.contrib.auth.models import User
class foo(models.Model):
user = OneToOneField(User, on_delete=models.CASCADE)
此外,您需要有 django 信号才能将扩展的 foo 模型与用户模型绑定。这样无论对 foo 做了什么更改,用户都可以收听它。
from django.db.models.signals import post_save
from django.dispatch import reciever
@reciever(sender=User, post_save)
def create_foo(sender, instance, created, **kwargs):
if created:
foo.objects.create(user=instance)
@reciever(sender=User, post_save)
def save_foo(sender, instance, **kwargs):
instance.foo.save()