2016-10-07 205 views
0

我正在一個Django項目,其中一個模型(可以說文件)工作具有以下字段:Django的自定義權限的授權

#In models.py 

class Document (models.Model): 
    choice = (('Yes','Yes'), ('No','No')) 
    authorized = models.CharField (max_length=3, choices=choice, default='No') 

現在,作爲一個普通用戶創建一個文檔對象,授權場沒有。但是,上級需要在實際批准之前對其進行授權。現在,django中是否有一個權限系統,一個用戶可以創建一個對象但不授權,而另一些用戶 - 擁有該權限 - 可以授權?如果沒有,是否唯一的方法是在用戶模型中創建一個自定義字段並每次檢查它?

回答

0

首先,爲什麼您需要將可能的值存儲在CharField而不是BooleanField?我認爲你應該考慮改爲BooleanField

你可以通過在admin.py提供定製ModelAmin類:所以現在的Document管理頁面上

from django.contrib import admin 
from .models import Document 

@admin.register(Document) 
class DocumentModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     if not request.user.is_superuser: 
      self.exclude = ['authorized'] 
     return super(DocumentModelAdmin, self).get_form(request, obj, **kwargs) 

如果不是超級用戶,用戶不會看到authorized場。您可以更改代碼,如果它應該是特定的用戶檢查,或有一定的權限,或者如果用戶屬於某個Group

UPDATE

如果你希望它是在一般的看法,你可以通過不同的形式給用戶,取決於他們的角色|權限|組(我不知道你所謂的高級與其他用戶不同)。所以答案是:創建兩個表單,然後根據您的request.user屬性在模板中傳遞它們。

+0

是的,我寧願去與布爾字段,我的壞。但人民不是超級用戶。我不希望這與管理員使用,但一般意見。就像有人正在創建發票(實際模型名稱是pursesInvoice和salesInvoice)。一旦創建,高級會授權它。所有這些應該發生在視圖中,而不是通過管理員,當然不是通過超級用戶。 – Sayantan

+0

@Vishes_shell ...謝謝隊友。但我想說的問題是,我怎樣才能防止一個人(沒有授權「授權」表單)訪問它。看,我創建對象A,並且有人應該授權它。這有點像工作流程。現在,應該通過檢查來處理這個可訪問性是自定義的request.user.is_permitted_to_authorize字段,還是有更好的方法? – Sayantan

+0

@SayantanGanguly您基本上需要做什麼,創建一些權限,您將分配優秀用戶,或創建代表上級用戶的組,並且在視圖中依賴於user.has_perm或user.groups中的group_name將呈現兩種形式之一(一種具有授權字段,一種沒有)。如果您以上級用戶的身份進入該頁面,會發生什麼情況,您會看到包含「授權」輸入的表單,但如果您不是上級,那麼您甚至不知道該字段是否存在。 –

0

Django有很棒的認證系統。我無法理解你的情況。 但你可以嘗試下面這樣的事情 默認情況下,每個Model對象都帶有三個Permission對象,比如(add_document,change_document和delete_document)。 如果您想要一些自定義權限,您可以將其添加到模型Meta類中,如下所示:

您可以將這些權限添加到User對象或Group對象。

models.py

class Document (models.Model): 
    ###### 
    class Meta: 
     permissions = (("Can see document dashbaord", "see_document"),) 

和運行python manage.py migrate來創建新的代號Permission對象爲"see_document"

您可以通過請求鑑於這樣的處理實現的權限:

view.py

from django.contrib.auth.mixins import PermissionRequiredMixin, permission_required 

# For function based view 
@pemission_required('document.see_document') 
def someview(request): 
    ###### 
    pass 

# For class based views 
class SomeView(PermissionRequiredMixin, BaseView): 

    permission_required = 'document.see_document' 

這可以在任何用戶用出來的PERMSSION重定向到權限被拒絕頁。更多詳情請參閱https://docs.djangoproject.com/en/1.10/topics/auth/

+0

非常感謝Amar給你的時間。現在你看,這是一個完整的基於模型/對象的權限。我想要基於對象狀態的權限。那就是任何人都可以創建一個對象。一旦創建,工作流將轉移到她/他的前輩,並且前輩應授權。換句話說,我有一個模型(它的purchaseInvoice&salesInvoice),它可以由子座標創建。一旦創建,模型字段授權爲False。老年人需要授權。如何才能做到這一點? – Sayantan

+0

你可以重寫默認模型保存方法 – Amar