2017-06-19 22 views
0

私はdjangoを初めて使用していますが、権限の仕組みや、私の場合に使用するはずのものについて少し混乱しています。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

私のソリューションは、DjangoのDecoratorの代替品になる可能性があります。 私はあなたの質問でかなり面白いです。私のHTMLファイル内に、次に

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

::私は私の意見で機能を持っていると私は、ユーザーグループに、このいずれかを表示したくない場合は

、私はtemplatetagsファイルを持っている

{% if request.user|has_group:"admin" %} 
    <li><a href="{% url "edited" %}">Some part</a></li> 
{% endif %} 

私のtemplatetagsでは、自分のviews.pyファイルに直接ユーザー権限を設定することができますが、その方法はわかりません。 とにかく、私の方法は、これまで非常によく動作します。)

1

で許可・承認の文書を読んで、

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): 
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) 
2

。 Djangoは既にPermission and Group models and per-group permissions,を持っていますので、ここで最もクリーンな "django互換"の方法は "Students"、 "Professors" a管理者をグループとして設定し、必要に応じてカスタム権限を追加し、適切なグループにユーザーを追加し、現在のユーザーがpermission_required decoratorを使用して特定のアクションに必要な権限を持っているかどうかをテストします。クラスベースのビューthe PermissionRequiredMixinを使用しています。サイドノートとして

:あなたはrole値に対するintsを使用していることから、あなたはあなたのモデルに彼らのためにpseudo_constantsを追加することもできます。

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をアクセス許可に使用すると、グループメンバーからクエリーセットを取得できるため、このフィールドはまったく必要ない場合もあります。

+0

本当に@Alasdair - 答えに追加、thx。 –

関連する問題