Как я могу добавить дополнительные поля модели к модели auth_user по умолчанию, используя django - PullRequest
0 голосов
/ 11 мая 2018

Я новичок в Джанго. Мне нужно включить дополнительные поля модели в мою модель пользователя (таблица auth_user в базе данных), а также я хочу включить поля ForeignKey также внутри auth_user

У меня есть четыре класса моделей, таких как 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'

Я включил модели Semestertype, Programtype, Programchoice в мои модели auth_user с использованием AbstractUser, как показано ниже

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 и добавить форму профиля

Заранее спасибо ...

1 Ответ

0 голосов
/ 11 мая 2018

Ошибка возникает из-за того, что метод __str__() пытается вернуть self.user.username, но некоторые из UserProfile экземпляров не имеют связанного экземпляра user (потому что вы определили его как null=True вмодель)

Итак, измените метод __str__() класса UserProfile, как показано ниже,

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
...