Python Django-处理多种用户类型并基于此路由HTML页面的最佳方法是什么?

Python Django-处理多种用户类型并基于此路由HTML页面的最佳方法是什么?,python,django,django-views,multi-user,Python,Django,Django Views,Multi User,我正在做一个小测试项目,用户类型如下:学校管理员、教师、学生、家长。 每个用户类型都有不同的权限,比如学校管理员有完全访问权限。。。家长只能查看孩子的活动。教师可以看到所有学生,但只能为其各自的学生添加/编辑分数。教师可以设置考试等。。学生可以参加考试并提交考试,但不能编辑/添加任何其他信息。只是可以编辑他的个人资料细节 方法1:我是否需要创建一个自定义用户计算并应用于每个用户类型(即一个自定义类..和4个用户类型计算)。。同样,有4个不同的视图和html页面 方法2:只要有一个自定义类,并有一

我正在做一个小测试项目,用户类型如下:学校管理员、教师、学生、家长。 每个用户类型都有不同的权限,比如学校管理员有完全访问权限。。。家长只能查看孩子的活动。教师可以看到所有学生,但只能为其各自的学生添加/编辑分数。教师可以设置考试等。。学生可以参加考试并提交考试,但不能编辑/添加任何其他信息。只是可以编辑他的个人资料细节

方法1:我是否需要创建一个自定义用户计算并应用于每个用户类型(即一个自定义类..和4个用户类型计算)。。同样,有4个不同的视图和html页面

方法2:只要有一个自定义类,并有一个UserType字段,该字段将有“SchoolAdmin”、“Teacher”、“Student”、“Parent”。。一个视图和html(因为数据页将保持不变,只有数据记录会受到限制),并以某种方式标识视图中的用户类型,并过滤记录

明确地说,一些视图或html页面将只针对一个我能够处理的用户类型,问题是使用相同的视图/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)

您的
CustomUser
类基本上是正确的。您实际上不需要其他类(SchoolAdmin、Teacher、Student、Parent),因为该功能由
user\u type
描述

您确实需要更改用户类型选择,例如:

SCHOOL, TEACHER, STUDENT, PARENT = 'school', 'teacher', 'student', 'parent'
USER_TYPES: (
    (SCHOOL, 'School'),
    (TEACHER, 'Teacher'),
    (STUDENT, 'Student'),
    (PARENT, 'Parent'),
)
photo
字段可以添加到
CustomUser
类中

此外,您还需要熟悉Django关于和的文档

然后,您可以创建组和权限,并将用户分配给这些组和权限。教师是一个拥有特定权限的群体,等等

此外,您还可以在模板和视图中按用户类型进行区分,以显示或隐藏信息,或访问。例如:

def exam_setup_view(request):
    # only teachers allowed here, others see 404
    if request.user.user_type != CustomUser.TEACHER:
        raise Http404()
EDIT说明如何使用Django的组和权限。例如,您可以在用户的元类上创建自定义权限,如下所示:

class CustomUser(AbstractUser):
    # ...
    class Meta:
        permissions = (
            ("can_create_exam", "Can create exam"),
            ("can_view_user", "Can view user"),
        )
这将创建这些自定义权限。您可以在Django的管理中或通过编程方式将这些分配给用户,如该文章或Django的文档中进一步解释的那样


有几种方法可以测试用户是否具有这些权限,即:使用所需的
权限
装饰器,或者当您的视图中有一个用户实例时:
user.has\u perm('appname.can\u create\u exam')
,或者从模板:
{%if perms.appname.can\u create\u exam%}
,谢谢您的帮助。。。您还可以分享一个关于如何使用组和权限的示例。。同时,我将阅读来自Django的文档。