[英]Django - What is the best approach to handle multiple user types…and route the HTML pages based on this?
我正在制作一个具有以下用户类型的小型测试项目:学校管理员、教师、学生、家长。 并且每种用户类型将具有不同的权限,例如学校管理员具有完全访问权限...家长只能查看他们孩子的活动。 教师可以查看所有学生,但只能为各自的学生添加/编辑分数。 教师可以设置考试等。学生可以参加考试并提交考试,但不能编辑/添加任何其他信息。 只是可以编辑他的个人资料详细信息。
方法 1:我是否需要创建自定义用户 calss 并应用于每种用户类型(即一个 Custome Class.. 和 4 个用户类型 calss).. 并且同样有 4 个不同的视图和 html 页面?
方法 2:只有一个客户 class 并有一个 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
class 基本上是正确的。 您实际上并不需要其他类(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
class。
此外,您还需要熟悉 Django 关于 自定义身份验证、 权限和授权的文档。
然后,您可以创建组和权限并将您的用户分配给它们。 教师是具有特定权限等的组。
您还可以通过模板和视图中的 user_type 进行区分,以显示或隐藏信息或访问。 例如:
def exam_setup_view(request):
# only teachers allowed here, others see 404
if request.user.user_type != CustomUser.TEACHER:
raise Http404()
编辑这篇文章解释了如何使用 Django 的组和权限。 例如,您可以在用户的 Meta class 上创建自定义权限,如下所示:
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 %}
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.