2017-08-16 80 views
1

我需要爲使用Django和Python的註冊用戶設置權限。我做了一些事情,但不知道它是否滿足我的要求。我在下面解釋我的代碼。如何根據用戶使用Django和Python設置權限?

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

    user_id = models.ForeignKey(User) 
    control_reactor = models.IntegerField(default=0) 
    find_reactor = models.IntegerField(default=0) 
    view_reactor = models.IntegerField(default=0) 
    class Meta: 
     """docstring for Meta""" 
     permissions = (
      ("view_reactor", "can view reactor"), 
      ("find_reactor", "can find reactor"), 
      ("controll_reactor", "can controll reactor"), 
     ) 

我使用Django裝飾功能,像@permission_required訪問這些許可。在這裏,我需要按用戶設置3個權限,但是這個模型類正在按照需求進行混淆。

回答

0

定義的元類只是表示您的模型將只具有這些權限,因此它變得易於管理。

您可以使用django的Permission類以編程方式創建權限。來自django文檔

用戶對象有兩個多對多字段:groups和user_permissions。用戶對象可以像其他任何Django模型一樣訪問其相關對象

權限模型存儲可以設置給特定用戶的所有權限。您只需添加創建權限並將其添加到用戶。

from django.contrib.auth.models import Permission, User 
content_type = ContentType.objects.get_for_model(BlogPost) 
permission = Permission.objects.get(
    codename='change_blogpost', 
    content_type=content_type, 
) 
user.user_permissions.add(permission) 

相關名稱是user_permissions這樣你就可以直接添加相同M2M關係的權限。

現在,假設你要檢查權限

user.has_perm('app_name.code_name') # generic example 
user.has_perm('myapp.change_blogpost') 

現在的裝飾,你可以做同樣的

@permission_required('app_name.code_name') 

編輯:一般來說,當你創建一個用戶,以上述例子可以授予權限在您註冊用戶的位置放入視圖。如果您不想授予權限的時候了,那麼你可以做哪些權限授予用戶

def grant_permissions(request): 
    user = request.user 
    # then you put the code mentioned above 

你的情況下,你可以創建一個使用權限模型在你的代碼的權限或使用元類的單獨視圖。

只是遷移數據庫以創建元類中定義的權限。遷移後,不要忘記使用權限模型使用上面提到的代碼授予用戶權限然後,您可以使用裝飾器中的權限。

@permission_required('view_reactor') 
+0

您可以編輯按我的權限集。在哪個文件中,我將定義代碼的第一部分,'BlogPost'是應用程序名稱的權利?在這裏我需要根據不同的用戶設置三種不同的權限。 – satya

+0

@satya查看編輯。 BlogPost是應用程序名稱。您還需要爲每個用戶明確使用權限模型授予權限。遷移後獲得Permission對象並使用它來授予用戶權限。 –

+0

權限將在管理頁面內設置,而不是任何登錄用戶,你的意思是'從django.contrib.auth。模型導入權限,用戶 DEF grant_permissions(請求): 用戶= request.user CONTENT_TYPE = ContentType.objects.get_for_model(植物) 權限= Permission.objects.get( 代號= 'change_plant', CONTENT_TYPE = CONTENT_TYPE, ) user.user_permissions.add(permission)',我需要在views.py中這樣寫。 – satya