我一直在尝试定制用户模型,这样它可以有不同的角色,我被卡住了。我不知道我错过了什么或者什么时候走错了方向。我应该创造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"
请提前帮助和感谢