如何 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()