【问题标题】:Django - What is the best approach to handle multiple user types...and route the HTML pages based on this?Django - 处理多种用户类型的最佳方法是什么……并基于此路由 HTML 页面?
【发布时间】:2020-04-26 16:31:45
【问题描述】:

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

方法 1:我是否需要创建一个自定义用户类并应用于每种用户类型(即一个自定义类..和 4 个用户类型类).. 并且类似地有 4 个不同的视图和 html 页面?

方法 2:只有一个客户类和一个带有 UserType 的字段,该字段将具有“SchoolAdmin”、“Teacher”、“Student”、“Parent”.. 以及一个视图和 html(作为数据页将保持不变,只有数据记录会受到限制),并以某种方式识别视图中的用户类型,并过滤记录?

当然,某些视图或 html 页面将特定于我能够处理的一种用户类型,问题是使用相同的视图/html 页面来处理所有用户类型。

请建议...任何代码 sn-p 都会更有帮助。

# 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)

【问题讨论】:

    标签: python django django-views multi-user


    【解决方案1】:

    您的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 在 custom authenticationpermissions and authorization 上的文档。

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

    您还可以通过模板和视图中的 user_type 进行区分,以显示或隐藏信息或访问。例如:

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

    EDIT This article 解释了如何使用 Django 的组和权限。例如,您可以在用户的​​ Meta 类上创建自定义权限,如下所示:

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

    这将创建这些自定义权限。您可以将这些分配给 Django Admin 中的用户,或者以编程方式,如该文章或 Django 文档中进一步说明的那样。

    有几种方法可以测试用户是否具有这些权限,即:使用 permission_required 装饰器,或者当您的视图中有用户实例时:user.has_perm('appname.can_create_exam'),或来自模板:{% if perms.appname.can_create_exam %}

    【讨论】:

    • 感谢这有帮助...您能否分享一个有关如何使用组和权限的示例.. 同时我将阅读 Django 的文档。
    猜你喜欢
    • 2016-05-17
    • 2010-09-05
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多