代码之家  ›  专栏  ›  技术社区  ›  Viqtoh

创建用户模型类型时发生FieldError

  •  0
  • Viqtoh  · 技术社区  · 3 年前

    我一直在尝试定制用户模型,这样它可以有不同的角色,我被卡住了。我不知道我错过了什么或者什么时候走错了方向。我应该创造4个角色:老师、学生、家长和班主任。这是我的模型。py:

    #importing modules
    from django.db import models
    from django.db.models.fields import proxy
    from django.utils.translation import gettext_lazy as _
    from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin, AbstractUser
    from django.utils import timezone
    from class_apps.models import Classes
    from class_apps.models import Subjects
    from phone_field import PhoneField
    
    
    ####MODELS
    
    #Managers
    class UserManager(BaseUserManager):
        def _create_user(self, username, password, is_staff, is_superuser, is_active, **extra_fields):
            if not username:
                raise ValueError('Users must have an username')
            now = timezone.now()
            user = self.model(
                username=username,
                is_staff=is_staff,
                is_active=is_active,
                is_superuser=is_superuser,
                last_login=now,
                date_joined=now,
                **extra_fields
            )
            user.set_password(password)
            user.save(using=self._db)
            return user
    
        def create_user(self, username=None, password=None, is_active=True, **extra_fields):
            return self._create_user(username, password, False, False, is_active, **extra_fields)
    
        def create_superuser(self, username, password, **extra_fields):
            user = self._create_user(username, password, True, True, True, **extra_fields)
            user.save(using=self._db)
            return user
        def save(self, *args, **kwargs):
            if not self.pk:
                self.type = User.Types.STUDENT
            return super().save(*args, **kwargs)
    
    class TeacherManager(models.Manager):
        def get_queryset(self, *args, **kwargs):
            return super().get_queryset(*args, **kwargs).filter(base_type=User.Types.TEACHER)
    
    class StudentManager(models.Manager):
        def get_queryset(self, *args, **kwargs):
            return super().get_queryset(*args, **kwargs).filter(base_type=User.Types.STUDENT)
    
    class ParentManager(models.Manager):
        def get_queryset(self, *args, **kwargs):
            return super().get_queryset(*args, **kwargs).filter(base_type=User.Types.PARENT)
    
        def create_parent(self, user, title, surname,other_names,email,phone_no,address,gender,marital_status,proposed_wards):
            parentdetails = self.create(user=user, title=title, surname=surname, other_names=other_names, email=email, phone_no=phone_no, address=address, gender=gender, marital_status=marital_status,proposed_wards=proposed_wards )
            return parentdetails
    
    # Users_Models
    class User(AbstractBaseUser, PermissionsMixin):
        'Abstract base user for all users'
        USERNAME_FIELD = 'username'
        REQUIRED_FIELDS = []
    
        objects = UserManager()
    
        class Types(models.TextChoices):
            'Class to handle different user types'
            TEACHER = "TEACHER", _("Teacher")
            STUDENT = "STUDENT", _("Student")
            PARENT = "PARENT", _("Parent")
            HEADTEACHER = "HEADTEACHER", _("HEADTEACHER")
        
        base_type = models.CharField(max_length=50, choices=Types.choices, null=True)
        
        username = models.CharField(max_length=254, null=True, blank=True,unique=True)
        is_staff = models.BooleanField(default=False)
        is_superuser = models.BooleanField(default=False)
        is_active = models.BooleanField(default=True)
        last_login = models.DateTimeField(null=True, blank=True)
        date_joined = models.DateTimeField(auto_now_add=True)
    
        
    
    # Proxy_Models
    class Teacher(User): 
        base_type = User.Types.TEACHER
        objects = TeacherManager()
    
        @property
        def more(self):
            return self.teacherdetails
        
        def save(self, *args, **kwargs):
            if not self.pk:
                self.type = self.base_type
            return super().save(*args, **kwargs)
    
        class Meta:
            proxy = True 
    
        def __str__(self):
            return f'{self.username}'
    
    class Student(User):
        base_type = User.Types.STUDENT
        objects = StudentManager()
    
        @property
        def more(self):
            return self.studentdetails
        
        def save(self, *args, **kwargs):
            if not self.pk:
                self.type = self.base_type
            return super().save(*args, **kwargs)
        
        class Meta:
            proxy = True
        
        def __str__(self):
            return f'{self.username}'
    
    class Parent(User):
        base_type = User.Types.PARENT
        objects = ParentManager()
    
        @property
        def more(self):
            return self.parentdetails
        
        def save(self, *args, **kwargs):
            if not self.pk:
                self.type = self.base_type
            return super().save(*args, **kwargs)
        
        class Meta:
            proxy = True
        
        def __str__(self):
            return f'{self.username}'
    
    class HeadTeacher(User):
        base_type = User.Types.HEADTEACHER
    
        def save(self, *args, **kwargs):
            if not self.pk:
                self.type = self.base_type
            return super().save(*args, **kwargs)
    
    # User_Models
    class StudentDetails(models.Model):
        user = models.OneToOneField(Student, on_delete=models.CASCADE)
        image = models.ImageField(upload_to='upload/', null=True)
        Name = models.CharField(max_length=50,  help_text='Full Name', null=True)
        Class = models.ForeignKey(Classes, on_delete=models.CASCADE, null=True, blank=True)
    
        def __str__(self):
            return f'{self.user} {self.id}'
    
    class TeacherDetails(models.Model):
        user = models.OneToOneField(Teacher, on_delete=models.CASCADE)
        Name = models.CharField(max_length=50,  help_text='Full Name', null=True)
        title = models.CharField(max_length=50, null=True, default=None)
        image = models.ImageField(upload_to='upload/', null=True)
        Staff_id = models.CharField(max_length=50)
        Phone_number = PhoneField(blank=True, help_text='Contact phone number')
        Bio = models.TextField(blank=True)
        Class = models.ManyToManyField(Classes)
        Subject = models.ManyToManyField(Subjects)
    
        def __str__(self):
            return f'{self.Name}'
    
    class ParentDetails(models.Model):
        user = models.OneToOneField(Parent, on_delete=models.CASCADE, null=True)
        image = models.ImageField(upload_to='parent/upload/', null=True)
        title = models.TextField(null=True)
        surname = models.TextField(null=True)
        other_names = models.TextField(null=True)
        email = models.EmailField(null=True)
        phone_no = models.TextField(null=True)
        address = models.TextField(null=True)
        gender = models.TextField(null=True)
        marital_status = models.TextField(null=True)
        proposed_wards = models.TextField(null=True)
        wards = models.ManyToManyField(StudentDetails)
        objects = ParentManager()
    
        def __str__(self):
            return f'{self.surname}'
    

    它不断地提出错误:

    FieldError at /admin-portal/users/parentdetails/
    Cannot resolve keyword 'base_type' into field. Choices are: address, email, gender, id, image, marital_status, other_names, phone_no, proposed_wards, surname, title, user, user_id, wards
    

    #import modules
    from django.contrib import admin
    from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
    from .models import *
    from class_apps.models import *
    
    # Register your models here.
    class UserAdminConfig(BaseUserAdmin):
        fieldsets = (
            (None, {'fields': ('username', 'password', 'last_login')}),
            ('Permissions', {'fields': (
                'is_active',
                'is_staff',
                'is_superuser',
                'user_permissions',
                
            )}),
        )
        add_fieldsets = (
            (
                None,
                {
                    'classes': ('wide',),
                    'fields': ('username', 'password1', 'password2')
                }
            ),
        )
    
        list_display = ('username','is_staff', 'last_login')
        list_filter = ('is_staff', 'is_superuser', 'is_active')
        search_fields = ('username',)
        ordering = ('username',)
        filter_horizontal = ('groups', 'user_permissions',)
    
    
    admin.site.register(HeadTeacher, UserAdminConfig)
    admin.site.register(Teacher, UserAdminConfig)
    admin.site.register(Student,UserAdminConfig)
    admin.site.register(Parent,UserAdminConfig)
    admin.site.register(TeacherDetails)
    admin.site.register(StudentDetails)
    admin.site.register(ParentDetails)
    
    #customizing admin template
    admin.site.site_header = "Sacred Hearts"
    admin.site.site_title = "Sacred Admin Portal"
    admin.site.index_title = "Welcome to Sacred Admin Portal"
    

    请提前帮助和感谢

    0 回复  |  直到 3 年前