[英]Custom permissions on Django group form
我已經為Post模型添加了一些自定義權限。
我還創建了一個表單,用於僅使用以下自定義權限來添加/編輯組:
class GroupFornm(forms.ModelForm):
permissions = forms.MultipleChoiceField(choices=Post._meta.permissions)
class Meta:
model = Group
fields = '__all__'
之所以有效,是因為我只能看到並選擇我的自定義權限,但是當我嘗試保存表單時出現錯誤:
以10為底的int()無效文字:“ can_view”
我究竟做錯了什么? 似乎此表單字段等待(int,str)對,但是文檔說(str,str)應該正常工作。
編輯
Post__meta。權限:
(('can_view', 'Can see tickets'), ('can_edit', 'Can edit tickets'), ('can_delete', 'Can delete tickets'), ('can_create', 'Can add new tickets'))
這個問題與表單本身並沒有真正的關系,但是實際上您需要以某種方式將這些permissions
轉換為應存儲在Group
實例(此ModelForm
正在管理的實例)中的Permission
對象。
我認為顯示選項不是問題。 但是,如果后來例如用戶執行POST
請求,與所述選項(如can_write
),則問題是,如何Form
應轉化到這些Permission
對象(或者的主鍵Permission
對象)。
在這種情況下,你需要強迫的權限名Permission
對象,或id
號第Permission
對象。 例如,我們可以使用TypedMultipleChoiceField
,並強制使用:
def get_permission_from_name(name):
return Permission.objects.get(name=name)
class GroupFornm(forms.ModelForm):
permissions = forms.TypedMultipleChoiceField(
choices=Post._meta.permissions,
coerce=get_permission_from_name,
)
class Meta:
model = Group
fields = '__all__'
請注意,上述內容並不是真正有效的實現,因為它需要對每個發送的值進行查詢。 此外,如果不存在具有該名稱的權限,則將引發錯誤。
如果要動態構造Permission
(如果尚未構造),則可以將函數更改為:
def get_permission_from_name(name):
return Permission.objects.get_or_create(
name=name,
defaults={ 'content_type': ContentType.objects.get_for_model(Post), 'codename': name }
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.