我正在使用 Django 的默认身份验证系统 (django.contrib.auth),我想以 Django Admin 可以使用的方式向我的用户添加“角色”。
一个例子:
- 用户可以是工作人员、教师、学生和/或家长
- 如果用户分配了角色,他将获得权限(例如,员工可以登录 Django 管理员)
- 某些角色可能有一些额外的字段(例如,父母与至少一个学生有关系,并且每个学生都有一个与其班级组相关的字段
- 并非每个角色都有额外的字段
- 家长可以是老师或工作人员,反之亦然
- 学生不能担任其他角色
有各种(常规)方法可以在模型中完成上述任务。Django 支持很多,但 Django 管理员不支持。Django admin 有很多很好的功能,所以我想使用它(但我越来越害怕它不可能)。
下面的模型是我一开始想到的:
class ExtendedUser(contrib.auth.models.User):
"""
For the ease of use I inherit from User. I might
want to add methods later
"""
pass
class StaffMember(models.Model):
"""
A staffmember is a co-worker of the organisation
and has permissions to make changes to (parts of)
the system.
For now the staffmember only has methods
"""
user = models.OneToOneField(ExtendedUser, related_name="staff_member")
class Student(models.Model):
"""
A student can participate in some courses
"""
user = models.OneToOneField(ExtendedUser, related_name="student")
class Teacher(models.Model):
user = models.OneToOneField(ExtendedUser, related_name="teacher")
subjects = models.ManyToManyField(..)
class Parent(models.Model):
user = models.OneToOneField(ExtendedUser, related_name="parent")
children = models.ManyToManyField(Student, related_name=parents")
这适用于 Django(以及许多其他基于 MVC 的框架)。但我找不到在管理员中显示上述内容的正确方法。
理想情况下,我想添加一个用户,然后在用户更改视图中添加不同的角色。起初我以为我可以使用内联:
class StudentInlineAdmin(admin.StackedInline):
model = Student
extra = 0
template = 'accounts/admin/role.html'
然后,我对内联模板进行了一些细微的更改,以显示带有标题“添加学生角色”的编辑用户按钮。一旦我们点击按钮,我们就会显示表单并添加一个用户角色。不理想,但它有效。
太糟糕了,对于员工来说,没有字段可以添加到内联表单中。这样就不可能触发内联表单的“has_changed”属性。这会导致新角色未保存到数据库中。
为了解决最后一个问题,我稍微修改了一下,在空的用户角色中添加了一个“虚拟”表单域,然后使用 JS 隐藏这个域。这确实触发了 has_changed。
但这仍然无法在以后的一些测试中以某种方式保存我的内联模型。
所以我认为我只是做错了。我做了很多谷歌搜索,发现很多人都在为同样的问题而烦恼。最适合我的情况是http://www.mail-archive.com/django-users@googlegroups.com/msg52867.html。但是这个解决方案仍然没有给我一个简单的方法来实现管理员。
我也考虑过使用内置组,但在这种情况下,我不知道应该如何添加不同的字段。
我想到的另一件事是尝试“添加学生”而不是添加用户并为他分配角色。如果您只是继承用户,这在管理员中效果很好:
class StudentUser(auth.models.User):
pass
但是这里有两个问题。起初,不可能既是工作人员又是老师。其次,在 Django 的其余部分中,请求对象返回的用户对象实际上并不能正常工作,无法为其请求学生、父母、员工对象。获得其中之一的唯一方法是基于 User 对象实例化一个新的 Student 对象。
所以这里有一个问题:我应该使用哪种类型的模型设计来向用户添加角色,以便它在 Django 和 Django 管理员中工作?
友好的问候, Wout