Django - Каков наилучший подход для обработки нескольких типов пользователей ... и маршрутизации страниц HTML на основании этого? - PullRequest
1 голос
/ 26 апреля 2020

Я делаю небольшой тестовый проект со следующими типами пользователей: администратор школы, учитель, ученик, родитель. И каждый тип пользователя будет иметь различные разрешения, как у администратора школы полный доступ ... Родители могут просматривать только активность своих детей. Учитель может видеть всех учеников, но может добавлять / редактировать оценки только для своих учеников. Учителя могут настроить экзамен и c. Учащиеся могут сдавать экзамен и сдавать экзамен, но не могут редактировать / добавлять любую другую информацию. Просто можете отредактировать детали своего профиля.

Подход 1: Нужно ли мне создавать пользовательский запрос пользователя и применять к каждому типу пользователя (ie один класс Custome .. и 4 типа пользователя calss) .. и аналогично есть 4 различных вида и html страницы?

Подход 2: Просто выберите один класс привычного использования и поле с UserType, которое будет иметь значение "SchoolAdmin", "Teacher", "Student", "Parent ".. и одно представление и html (поскольку страница данных останется такой же, и только запись данных будет ограничена), и каким-то образом идентифицировать тип пользователя в представлении и отфильтровать запись?

Определенно какое-то представление или html страниц будут указаны c только для одного типа пользователя, который я могу обработать, проблема заключается в том, чтобы использовать тот же вид / html страницы для обработки всех типов пользователей.

Пожалуйста, предложите. ... и любой фрагмент кода будет более полезным.

# models.py
---------------------
class CustomUser(AbstractUser):
    USER_TYPE_CHOICES = (
        ('SchoolAdmin'),
        ('Teacher'),
        ('Student'),
        ('Parents'),
    )

    user_type = models.CharField(blank=False, choices=USER_TYPE_CHOICES)
    name = models.CharField(blank=False, max_length=255)
    country = models.CharField(blank=False, max_length=255)
    city = models.CharField(blank=False, max_length=255)
    phone = models.CharField(blank=True, max_length=255)
    created_at = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.name


class SchoolAdmin(models.Model):
    user = models.OneToOneField(
        CustomUser, on_delete=models.CASCADE, primary_key=True)


class Teacher(models.Model):
    user = models.OneToOneField(
        CustomUser, on_delete=models.CASCADE, primary_key=True)
    photo = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True)


class Student(models.Model):
    user = models.OneToOneField(
        CustomUser, on_delete=models.CASCADE, primary_key=True)
    teacher = models.ForeignKey(Teacher)
    photo = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True)

class Parent(models.Model):
    user = models.OneToOneField(
        CustomUser, on_delete=models.CASCADE, primary_key=True)
    student= models.ForeignKey(Student)

1 Ответ

1 голос
/ 27 апреля 2020

Ваш CustomUser класс по существу правильный. Вам не нужны другие классы (SchoolAdmin, Teacher, Student, Parent), так как эта функциональность описана как user_type.

. Вам нужно изменить выбор типа пользователя, например:

SCHOOL, TEACHER, STUDENT, PARENT = 'school', 'teacher', 'student', 'parent'
USER_TYPES: (
    (SCHOOL, 'School'),
    (TEACHER, 'Teacher'),
    (STUDENT, 'Student'),
    (PARENT, 'Parent'),
)

Поле photo можно добавить к классу CustomUser.

Кроме того, вы захотите ознакомиться с документацией Django по пользовательской аутентификации и разрешения и авторизация .

Затем вы можете создавать группы и разрешения и назначать им пользователей. Преподаватели - это группа с указанными правами доступа c и т. Д. c.

. Кроме того, вы можете различать по типу user_type в своих шаблонах и представлениях, чтобы показать или скрыть информацию или получить доступ. Например:

def exam_setup_view(request):
    # only teachers allowed here, others see 404
    if request.user.user_type != CustomUser.TEACHER:
        raise Http404()

РЕДАКТИРОВАТЬ В этой статье объясняется, как использовать группы и разрешения Django. Например, вы можете создать пользовательские разрешения для мета-класса вашего пользователя, например, так:

class CustomUser(AbstractUser):
    # ...
    class Meta:
        permissions = (
            ("can_create_exam", "Can create exam"),
            ("can_view_user", "Can view user"),
        )

Это создаст эти пользовательские разрешения. Вы можете назначить их пользователям в Django Admin или программно, как более подробно описано в этой статье или документации Django.

Есть несколько способов проверить, есть ли у пользователя такие разрешения, ie: используйте декоратор permission_required, или когда у вас есть пользовательский экземпляр в вашем представлении: user.has_perm('appname.can_create_exam'), или из шаблона: {% if perms.appname.can_create_exam %}.

...