我了解基本的用户身份验证,登录,创建帐户,扩展用户模型......
我正在尝试创建一个教师和学生可以登录的网站。教师可以访问学生无法访问的页面,并有权发布作业等...
我认为可以这样做:
@login_required
@user_passes_test(not_in_student_group, login_url='/login/')
def some_view(request):
# ...
def not_in_student_group(user):
if user:
return user.groups.filter(name='Student').count() == 0
return False
注意我从以下代码获得了上述代码:
http://bradmontgomery.blogspot.com/2009/04/restricting-access-by-group-in-django.html
问题:
使用权限与上述方法有何不同?
如何使用权限,以及定义权限如何帮助我实现上述结果? (如果可以这样做,是否应该使用?)
答案 0 :(得分:4)
似乎有一百种方法让人们在Django中获得与授权和权限相同的结果。群体肯定是单向的。
Django权限通常基于您的数据,因此“基于表”或“基于行”。基于行的权限不是Django的原生权限,您必须推出自己的解决方案,或使用django-guardian或django-authority More Here之类的内容。
权限文档为here
class Quiz(models.Model):
title = models.CharField(max_length=64)
class Meta:
permissions = (
("can_take_quiz", "Can take quiz"),
("can_grade_quiz", "Can Grade Quiz"),
)
使用此模型和这些权限,您可以看到学生助理可能会获得对特定测验进行评分的权限,或者给定教师的测验,这是基于行的权限有用的地方。实现类似的东西(通过has_permission)可以解决问题(并且更明确),而不仅仅是将用户添加到组中。
您可以将用户添加到您已经拥有的群组中,然后授予整个群组权限以添加测验或评分等级(教师可以添加/编辑/删除/评分,学生可以参加)quizes,并根据这一点。
然后你的user_passes_test将是user.has_perm('quiz.take_quiz')
或者不是装饰者,你可以将特定的测验传递给基于后端的对象。