如何使用 django 向默认 auth_user 模型添加额外的模型字段

Posted

技术标签:

【中文标题】如何使用 django 向默认 auth_user 模型添加额外的模型字段【英文标题】:How can i add extra model fields to default auth_user model using django 【发布时间】:2018-10-21 14:31:09 【问题描述】:

我是 Django 新手。我需要在我的用户模型(数据库中的 auth_user 表)中包含一个额外的模型字段,并且我还想在 auth_user 中包含 ForeignKey 字段

我有四个模型类,例如 Semestertype、Programtype、Programchoice:

import datetime
from django.utils import timezone

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save

from django.contrib.auth.models import AbstractUser

class Semestertype(models.Model):
value = models.CharField(max_length=100, null=True, blank=True)

class Meta:
    db_table = 'semestertype'


class Programtype(models.Model):
value = models.CharField(max_length=100, null=True)

class Meta:
    db_table = 'programtype'

class Programchoice(models.Model):
value = models.CharField(max_length=100, null=True, blank=True)

class Meta:
    db_table = 'programchoice'

我使用 AbstractUser 在我的 auth_user 模型中包含了 Semestertype 、 Programtype 、 Programchoice 模型,如下所示

class User(AbstractUser):
   semestertype = models.ForeignKey(Semestertype, on_delete=models.CASCADE,null=True, blank=True)
   programtype = models.ForeignKey(Programtype, on_delete=models.CASCADE,null=True, blank=True)
   programchoice = models.ForeignKey(Programchoice, on_delete=models.CASCADE,null=True, blank=True)
   filenumber = models.CharField(null=True, max_length=9, blank=True)
   personalemail = models.EmailField(max_length=254, blank=True)
   nameofbachelorsdegree = models.CharField(max_length=200, null=True, blank=True)

这是我的个人资料模型:

class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE,null=True, blank=True)
description = models.CharField(max_length=100,  default = '')
city = models.CharField(max_length=100, default = '')
phone = models.IntegerField(default=0)

def __str__(self):
    return self.user.username

def create_profile(sender, **kwargs):
if kwargs['created']:
    user_profile = UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile, sender=User)

最后我像这样添加我的 settings.py 文件:

AUTH_USER_MODEL = 'polls.User'# changes built-in user model to ours

我尝试将 ForeignKey 字段和普通字段添加到 auth_user 并创建配置文件表单,但在这里我收到如下错误

AttributeError at /admin/polls/userprofile/add/
'NoneType' object has no attribute 'username'

我是 Django 新手,我不知道我哪里做错了,请帮助我任何人以正确的方式向 auth_user 添加额外字段并添加配置文件表单

提前谢谢...

【问题讨论】:

尝试阅读learnbatta.com/blog/using-custom-user-model-in-django-23。它可能会帮助你。 @Anjaneyulu Batta 非常感谢您的快速响应,我尝试了同样的方法,但在创建 UserProfile 时仍然出现错误,我收到类似“NoneType”对象没有属性“用户名”的错误 尝试在个人资料中添加用户字段为user = models.OneToOneField(User, on_delete=models.CASCADE) and migrate the changes. @Anjaneyulu 我已经添加了请看上面我的代码 在运行 python manage.py makemigrations 时,我觉得您正在尝试在没有默认值的情况下向用户添加不可为空的字段“用户名”;我们不能这样做(数据库需要一些东西来填充现有的行)。 【参考方案1】:

由于__str__() 方法试图返回self.user.username,错误正在引发,但是,一些UserProfile 实例没有相关的user 实例,(因为您将其定义为null=True in模型)

所以,如下更改UserProfile 类的__str__() 方法,

class UserProfile(models.Model):
    # your fields

    def __str__(self):
        if self.user:
            return self.user.username
        return "no user related to this profile"

或者,如下更改您的 UserProfile 模型并进行迁移,

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)  # <<< change is here
    description = models.CharField(max_length=100, default='')
    city = models.CharField(max_length=100, default='')
    phone = models.IntegerField(default=0)

    def __str__(self):
        return self.user.username

【讨论】:

@Anjaneyulu Batta 和@Jerin Peter George 非常感谢您的宝贵支持。如果你不介意,你能告诉我学习 Django 的好教程吗?我一周前开始学习了 非常感谢@Jerin Peter George

以上是关于如何使用 django 向默认 auth_user 模型添加额外的模型字段的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何使用 auth_user 表的 is_active?

用户注册错误:没有这样的表:auth_user

Django的认证系统

django:从管理面板向用户发送邮件

django安全认证组件

auth组件