首页 > 解决方案 > 如何在 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并将我的自定义字段添加到其中?

标签: pythondjangomodel

解决方案


您可以参考 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)

推荐阅读