Django Admin не позволяет мне изменить какие-либо настройки пользователя после реализации AbstractUser
После видео на Youtube я хочу создать сайт с различными ролями для учеников и учителей. Я также хотел бы сохранить ID школы в пользователе.
Вот то, что я хочу изменить, но когда я нажимаю сохранить, ничего не происходит.
Я пробовал создавать пользовательские формы для создания и изменения, но, похоже, это не имеет значения. Мне кажется, что я что-то не так ввел в model.py или что-то упустил. Создание пользователей работает как шарм, поэтому я не понимаю, почему он не обновляет пользователя правильно. Я уже делал полностью пользовательский класс пользователя, но для такого простого изменения это не нужно.
В настройке есть такая строка
AUTH_USER_MODEL = "account_app.User"
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db.models.signals import post_save
from django.dispatch import receiver
class School(models.Model):
name = models.CharField('School Name', max_length=240)
address1 = models.CharField('Address 1', max_length=240)
address2 = models.CharField('Address 2', max_length=240)
city = models.CharField('City', max_length=240)
district = models.CharField('District', max_length=240)
state = models.CharField('State', max_length=2)
zip_code = models.IntegerField('Zip Code')
country =models.CharField('Country', max_length=240)
phone = models.IntegerField('School Phone Number')
time_zone = models.CharField(max_length=50)
def __str__(self):
return f'{self.name}'
class User(AbstractUser):
class Role(models.TextChoices):
ADMIN = "ADMIN", "Admin"
STUDENT = "STUDENT", "Student"
TEACHER = "TEACHER", "Teacher"
base_role = Role.ADMIN
role = models.CharField(max_length=50, choices=Role.choices)
school_id = models.ForeignKey(School,blank=True, null=True, on_delete=models.DO_NOTHING)
def save(self, *args, **kwargs):
if not self.pk:
self.role = self.base_role
return super().save(*args, **kwargs)
class StudentManager(BaseUserManager):
def get_queryset(self, *args, **kwargs):
results = super().get_queryset(*args, **kwargs)
return results.filter(role=User.Role.STUDENT)
class Student(User):
base_role = User.Role.STUDENT
student = StudentManager()
class Meta:
proxy = True
def save(self, *args, **kwargs):
if not self.pk:
self.role = User.role.STUDENT
return super().save(*args, **kwargs)
def welcome(self):
return "Only for students"
class TeacherManager(BaseUserManager):
def get_queryset(self, *args, **kwargs):
results = super().get_queryset(*args, **kwargs)
return results.filter(role=User.Role.TEACHER)
class Teacher(User):
base_role = User.Role.TEACHER
teacher = TeacherManager()
class Meta:
proxy = True
def save(self, *args, **kwargs):
if not self.pk:
self.role = User.role.TEACHER
return super().save(*args, **kwargs)
def welcome(self):
return "Only for teachers"
это admin.py
from django.contrib import admin
from .models import User
from .models import Student
from .models import Teacher
admin.site.register(User)
admin.site.register(Teacher)
admin.site.register(Student)
Похоже, что вы изменили разрешения по умолчанию для абстрактного класса пользователей, поэтому вы можете попробовать этот способ добавления пользовательских разрешений для каждой модели, например:
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
@admin.register(User)
class CustomUserAdmin(UserAdmin):
def has_change_permission(self, request, obj=None):
return True
def has_delete_permission(self, request, obj=None):
return False
Вот полная документация: Admin Panel Permissions Doc.