我不會使用對象級權限來執行像您的要求一樣簡單的操作。你只需要有一個owner
ForeignKey的到模型中,只允許每個對象的所有者對其進行修改(您可以使用Plan_Owner
- 請改爲plan_owner
和Ticket_Number
到ticket_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
它從刪除request
kwargs
並將其設置爲屬性,並在保存時將該對象的所有者設置爲reqest.user
。
Serafeim ...我得到一個錯誤在我的admin.py說:異常類型:TypeError 異常值:'元組'對象不能調用,當我執行代碼根據我發佈的初始問題?我如何確保所有用戶都進入更改模型中的django admin的下拉菜單中? – Amistad
Hello Amistad,在提出的解決方案中,您將創建您自己的視圖來添加/修改對象,並且管理界面將「僅」可用於有權訪問所有對象的管理員!如果你想在你的管理面板中擁有用戶擁有的對象,那麼你應該問一個不同的問題(然而這是更困難的,並沒有真正提出,因爲管理界面應該只能從管理員,而不是普通用戶可見)。 – Serafeim