Python 如何使用django向默认auth_用户模型添加额外的模型字段
我是Django的新手。我需要在数据库中的用户模型auth_User表中包含一个额外的模型字段,同时我还希望在auth_User中包含ForeignKey字段 我有四个模型类,如Semestertype、Programtype、Programchoice:Python 如何使用django向默认auth_用户模型添加额外的模型字段,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我是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 Us
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_用户模型中包括了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字段和normal字段来验证用户并创建配置文件表单,但在这里我遇到了如下错误
AttributeError at /admin/polls/userprofile/add/
'NoneType' object has no attribute 'username'
我是Django的新手,我不知道我哪里做错了,请帮助我找到合适的方法,向auth_用户添加额外字段并添加配置文件表单
提前感谢…由于_ustr_uuu方法试图返回self.user.username,因此引发了错误,但是,一些UserProfile实例没有相关的用户实例,因为您在模型中将其定义为null=True 因此,如下更改UserProfile类的_str__方法 或者,如下更改您的UserProfile模型并进行迁移
试着阅读。这可能会对您有所帮助。@Anjaneyulu Batta感谢您如此快速的响应我尝试了同样的方法,但在创建用户配置文件时仍然出错我遇到了类似这样的错误“NoneType”对象没有“username”属性尝试在配置文件中添加user字段,如user=models.onetoonefeelduser,on_delete=models.CASCADE并迁移更改@在运行python manage.py makemigrations时,我已经添加了Anjaneyulu,请查看我的代码上方,我感觉您正在尝试在没有默认值的情况下向用户添加一个不可为null的字段“username”;我们不能这样做,数据库需要一些东西来填充现有行。@Anjaneyulu Batta和@Jerin Peter George非常感谢您宝贵的支持。如果你不介意的话,你能告诉我学习Django的好教程吗?我一周前就开始学习了。非常感谢@Jerin Peter George
class UserProfile(models.Model):
# your fields
def __str__(self):
if self.user:
return self.user.username
return "no user related to this profile"
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