2017-08-14 5 views
4

私はいくつかの助けが必要です。私はいくつかの関数にテーブル値ごとにパーミッションを与える必要があります。私は最初に自分のモデルを説明しています。DjangoとPythonを使用してテーブル値ごとにパーミッションを与える方法

class Permission(models.Model): 
    """docstring for Permission""" 

    user = models.ForeignKey(User) 
    control_reactor = models.IntegerField(default=0) 
    find_reactor = models.IntegerField(default=0) 
    view_reactor = models.IntegerField(default=0) 

期待される表は以下の通りです。

id control_reactor  view_reactor  find_reactor user_id 

1  1     1     1    2 

2  0      1     0    1 

ここで、user_id = 2がサイトにログインしているとします。 views.py以下の機能の許可を設定する必要があります。

views.py:ここ

def home(request): 
    """ This function for home screen . """ 

    return render(request, 'plant/home.html', {'count': 1}) 


def view_reactor(request): 
    """ This function for to get serch screen. """ 

    return render(request, 'plant/view_reactor.html', 
         {'count': 1}) 

私はデコレータ機能[email protected]_required and @login_requiredのように使用する必要があります。 user_id=2がログインしているとしたら、control_reactor=1,view_reactor=1,find_reactor=1のようにDB内のすべての権限をチェックし、すべてがhomeの機能をチェックし、view_reactorの機能の場合はview_reactor=1をチェックします。 user_id=1の場合も同様です。私を助けてください。

答えて

0

この方法はどうですか?

from functools import wraps 

def custom_permission_check(func): 
    @wraps(func) # so that you can use help() method. 
    def wrapper(*args, **kwargs): 
     result = func(*args, **kwargs) 
     func_name = func.__name__ # get function name 
     request = args[0] # get request from args 
     permission_criteria = { 
      'home':['control_reactor', 'view_reactor', 'find_reactor'], 
      'control_reactor':['control_reactor'], 
     } 
     qs = Permission.objects.filter(user=request.user) 
     for per in permission_criteria[func_name]: 
      qs.filter(**{per: 1}) # use variable for field 
     if not qs.exists(): # when it doesn't pass 
      render(request, 'somepage.html', {}) # permission denied page 
     return result 
    return wrapper 

@custom_permission_check 
def control_reactor(request): 
    return render(...) 

@ custom_permission_check 
def home(request): 
    return render(...) 
+0

確認してお知らせください。 – subhra

+0

それは何らかのエラーを投げます。 '例外値:\t キーワード 'user'をフィールドに解決できません。 'view_reactor'関数を呼び出すと、control_reactor、find_reactor、id、user_id、user_id_id、view_reactor'の選択肢があります。 '[ 'view_reactor']、 :[ 'control_reactor'、 'view_reactor'、 'find_reactor']、 'control_reactor':[ 'control_reactor']、 'view_reactor' – subhra

+0

この 'permission_criteriaが= { 'ホーム' を参照find_reactor ':[' find_reactor ']、 } '。私は余分に追加しました。 – subhra

関連する問題