我是django的新手,我对许可的工作原理有点困惑,或者这是我应该在我的情况下使用的。
所以,我有我的用户/型号:
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
ROLE_CHOICES = (
(0, ('Student')),
(1, ('Proffesor')),
(2, ('Administration'))
)
role = models.IntegerField(choices=ROLE_CHOICES, default=2)
然后我在选举/ views.py:
中有我的观点class MainPage(View)
class ElectionList(LoginRequiredMixin, View)
class ElectionDetail(LoginRequiredMixin, View)
#only administration can create elections
class CreateElection(LoginRequiredMixin, CreateView)
如何限制简单用户(例如学生)创建选举?
答案 0 :(得分:2)
Django已经拥有Permission
and Group
models and per-group permissions,所以这里最干净的“django兼容”方式是将“学生”,“教授”和“管理员”定义为群组,设置他们的权限(如果需要,最终添加自定义权限) ,将您的用户添加到相应的组,并使用permission_required
decorator或使用基于类的视图the PermissionRequiredMixin
测试当前用户是否具有所需操作的权限。
作为旁注:由于您使用ints
作为role
值,因此您可能希望在模型中为它们添加伪余量:
class User(AbstractUser):
ROLE_STUDENT = 0
ROLE_PROFESSOR = 1
ROLE_ADMINISTRATOR = 2
ROLE_CHOICES = (
(ROLE_STUDENT, 'Student'),
(ROLE_PROFESSOR, 'Professor'),
(ROLE_ADMINISTRATOR, 'Administration')
)
因此,您可以使用合理的人类可读值而不是幻数来查询/过滤模型,即:
students = User.objects.filter(role=User.ROLE_STUDENT)
而不是
students = User.objects.filter(role=0)
但是如果您使用contrib.auth.models.Group
获取权限,则根本不需要此字段,因为您可以从组成员中获取您的查询集。
答案 1 :(得分:1)
您可以使用UserPassesTestMixin
例如,
class LoginAndPermission(LoginRequiredMixin, UserPassesTestMixin):
def test_func(self):
return self.request.user.is_student
def get_login_url(self):
if self.request.user.is_authenticated():
# User is logged in but does not have permission
return "/permission-denied-url/"
else:
# User is not logged in
return "/login/"
class ElectionDetail(LoginAndPermission, View):
答案 2 :(得分:0)
我的解决方案可以替代Django的装饰器。 我的问题非常有趣。
当我在我的观看中有功能并且我不想将这个显示给用户组时,我有一个templatetags文件:
from django import template
from django.contrib.auth.models import Group
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
group = Group.objects.get(name=group_name)
return group in user.groups.all()
然后,在我的HTML文件中:
{% if request.user|has_group:"admin" %}
<li><a href="{% url "edited" %}">Some part</a></li>
{% endif %}
我认为我的模板标签可以直接在我的views.py文件中获得用户权限,但我不知道如何做到这一点。 无论如何,到目前为止,我的方法运作良好;)
答案 3 :(得分:0)
答案 4 :(得分:0)
from django.contrib.auth.mixins import AccessMixin
class AddElectionPermission(AccessMixin):
raise_exception = True
permission_denied_message = 'permission deny'
def dispatch(self, request, *args, **kwargs):
if request.user.role != 0:
return self.handle_no_permission()
return super(AddElectionPermission, self).dispatch(request, *args, **kwargs)
#only administration can create elections
class CreateElection(LoginRequiredMixin, AddElectionPermission, CreateView)