簡體   English   中英

Django組表單上的自定義權限

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM