Django Admin не позволяет мне изменить какие-либо настройки пользователя после реализации AbstractUser

После видео на Youtube я хочу создать сайт с различными ролями для учеников и учителей. Я также хотел бы сохранить ID школы в пользователе.

Вот то, что я хочу изменить, но когда я нажимаю сохранить, ничего не происходит.

enter image description here

Я пробовал создавать пользовательские формы для создания и изменения, но, похоже, это не имеет значения. Мне кажется, что я что-то не так ввел в 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.

Вернуться на верх