2013-12-21 50 views
4

我有一個模型,它看起來像這樣:對象級別的權限

class Change(models.Model): 
    RFC = models.CharField(max_length=10) 
    Ticket_Number = models.CharField(max_length=10) 
    Plan_Owner = models.ForeignKey(User) 

我然後通過這個登記在Django管理模型:

class ChangeAdmin(admin.ModelAdmin): 
    search_fields = ('RFC', 'Ticket_Number','Plan_Owner') 
    list_display = ('RFC', 'Ticket_Number','Plan_Owner') 

    fieldsets = [ 
     ('Ticket Details', { 
      'fields': ['RFC', 'Ticket_Number', 'Plan_Owner']}), 
    ] 

admin.site.register(Change, ChangeAdmin) 

我想實現的是以確保特定更改的Plan_owner是除超級用戶之外唯一可以對其進行編輯的人員。每個人都可以查看它,但是計劃負責人是唯一可以對其進行更改的人。另外,我的意思是,他可以做任何事情,但可以刪除一行。我看了一下Django的監護人,它確實是我想要的,但是必須手動設置每行的監護人權限。我正在尋找一個解決方案,其中這些權限是根據我的要求自動設置的......

回答

5

我不會使用對象級權限來執行像您的要求一樣簡單的操作。你只需要有一個owner ForeignKey的到模型中,只允許每個對象的所有者對其進行修改(您可以使用Plan_Owner - 請改爲plan_ownerTicket_Numberticket_number要與PEP 8和django style guide兼容) 。

我寫了一個說明如何做到這一點在Django一個帖子:

http://spapas.github.io/2013/11/05/django-authoritiy-data/

其實我描述瞭如何使用該用戶所屬部門和每個用戶都可以編輯自己的權威的對象,但您的要求已涵蓋。

更新

爲了完整起見,我在這裏將實現:

你創建和更新類爲本次已請求傳遞到您的形式,也是你的詳細信息和更新CBV應該只允許獲得屬於用戶對象(讓我們假設你的模型被命名爲UserData

class UserDataCreateView(CreateView): 
    model=models.UserData 

    def get_form_kwargs(self): 
     kwargs = super(UserDataCreateView, self).get_form_kwargs() 
     kwargs.update({'request': self.request}) 
     return kwargs 

class UserDataDetailView(DetailView): 
    def get_object(self, queryset=None): 
     obj = super(UserDataDetailView, self).get_object(queryset) 
     if not user_has_access(obj, self.request): 
      raise Http404(u"Access Denied") 
     return obj 

class UserDataUpdateView(UpdateView): 
    model=models.AuthorityData 

    def get_form_kwargs(self): 
     kwargs = super(UserDataUpdateView, self).get_form_kwargs() 
     kwargs.update({'request': self.request}) 
     return kwargs 

    def get_object(self, queryset=None): 
     obj = super(UserDataUpdateView, self).get_object(queryset) 
     if not user_has_access(obj, self.request): 
      raise Http404(u"Access Denied") 
     return obj 

它檢查request.user有行政許可法(是對象的所有者),並將request傳遞給ModelForm。上面剛剛定義的has_access功能檢查,如果當前用戶是對象的所有者:

def has_access(obj, req): 
    if req.user == obj.owner: 
     return True 
    return False 

三百峯的ModelForm應該是這樣的(同樣用於創建/更新):

class UserDataModelForm(forms.ModelForm): 
    class Meta: 
     model = models.UserData 
     exclude = ('owner',) 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(ActionModelForm, self).__init__(*args, **kwargs) 

    def save(self, force_insert=False, force_update=False, commit=True): 
     obj = super(UserDataModelForm, self).save(commit=False) 
     if obj: 
      obj.owner = self.request.user 
      obj.save() 
     return obj 

它從刪除requestkwargs並將其設置爲屬性,並在保存時將該對象的所有者設置爲reqest.user

+0

Serafeim ...我得到一個錯誤在我的admin.py說:異常類型:TypeError 異常值:'元組'對象不能調用,當我執行代碼根據我發佈的初始問題?我如何確保所有用戶都進入更改模型中的django admin的下拉菜單中? – Amistad

+0

Hello Amistad,在提出的解決方案中,您將創建您自己的視圖來添加/修改對象,並且管理界面將「僅」可用於有權訪問所有對象的管理員!如果你想在你的管理面板中擁有用戶擁有的對象,那麼你應該問一個不同的問題(然而這是更困難的,並沒有真正提出,因爲管理界面應該只能從管理員,而不是普通用戶可見)。 – Serafeim