В дальнейшем я предполагаю, что вы не хотите изменять администратора или делать копию django.contrib.admin
и взламывать ее по желанию.
Пользователь может быть сотрудником, учителем, учеником и / или родителем
Вы можете сохранить это в профиле пользователя . Наследование от User
также будет работать, но вместо использования User.get_profile()
вам нужно вручную отобразить с User
на ExtendedUser
.
Если пользователю назначена роль, он получит разрешения (например, штатные сотрудники могут войти в администратор Django)
В этом конкретном случае вы не можете использовать автоматическое назначение на основе ролей. Возможность доступа администратора к администратору определяется полем is_staff
в его записи User
.
Самым автоматическим способом, который я могу придумать, является создание «Обновления разрешений» команда администратора , которая будет обновлять поля администратора, например is_staff
, и разрешения, основанные на роли, установленной в профиле пользователя. Кстати, хотя это и не полностью «автоматический», это денормализация, которая может улучшить производительность.
В некоторых ролях могут быть дополнительные поля (например, у родителя есть связь хотя бы с одним учеником, а у каждого ученика есть поле со своей группой классов
Не каждая роль имеет дополнительные поля
Родитель может быть учителем или сотрудником, и наоборот
Студент не может иметь другую роль
Читайте о проверке формы . Вот где вы можете применять эти правила.
В вашей модели я бы порекомендовал вам изменить связанные имена ваших однозначных полей:
class StaffMember(models.Model):
user = models.OneToOneField(ExtendedUser, related_name="as_staff_member")
class Student(models.Model):
user = models.OneToOneField(ExtendedUser, related_name="as_student")
class Teacher(models.Model):
user = models.OneToOneField(ExtendedUser, related_name="as_teacher")
class Parent(models.Model):
user = models.OneToOneField(ExtendedUser, related_name="as_parent")
Поскольку theUser.as_teacher
намного яснее, чем theUser.teacher
(который я бы прочитал как "учитель пользователя").
Это работает в Django (и во многих других основанных на MVC фреймворках). Но я не могу найти правильный способ отобразить вышесказанное в админке.
В каждой роли у администратора будет одна таблица. Нет никакой причудливой функции «нижняя половина страницы редактирования будет перерисовываться при смене ролей». Если вы хотите этого, вам нужно написать своего администратора.
Администратор Django великолепен, но он не пытается быть всем для всех. У меня есть настройки на основе ролей, подобные вашей (за исключением того, что сами роли хранятся в таблице), и администратор работает нормально, если немного неуклюже. Основная идея заключается в том, что если администратор не достаточно хорош, то вы должны писать свои собственные взгляды.
Я также думал об использовании встроенных групп, но в этом случае я понятия не имею, как мне добавить различные поля.
Встроенные группы - это не то, что вам нужно.
Еще одна вещь, о которой я думал, это попытка «Добавить студента» вместо добавления пользователя и назначения ему роли. [...] Сначала невозможно быть сотрудником и учителем.
«Субклассинг» является более строгим, один к одному. Я думаю, что ваша начальная модель лучше.
Во-вторых, он не работает в остальной части Django, поскольку объект запроса возвращает объект User, для которого невозможно запросить объект Student, Parent, Staffmember. Единственный способ получить один из них - создать новый объект Student на основе объекта User.
Нет, вместо этого вы находите объект Student
, используя автоматически сгенерированный id
из объекта User
:
try:
theStudent = Student.objects.get(user_ptr_id=theUser.id)
except Student.DoesNotExist:
# That user isn't a student; deal with it here.
Если вы собираетесь использовать администратора, Я думаю, что вам придется жить с двухэтапным процессом добавления ExtendedUser
, затем добавления Student
или любых других записей. для них.
Итак, все сводится к компромиссу: немного дополнительной работы с использованием встроенного администратора или написания собственных представлений управления пользователями. Какой маршрут лучше всего зависит от того, насколько этот интерфейс будет использоваться: если это только вы, то с администратором все должно быть в порядке, даже с бородавками. Если многие люди будут использовать его на регулярной основе, то вам просто нужно написать свои собственные представления для обработки вещей.