如何使用Djangoguardian在管理界面的对象权限窗体中添加组选项?

2024-05-14 09:04:30 发布

您现在位置:Python中文网/ 问答频道 /正文

django项目中使用guardian,我希望管理员能够通过管理接口分配对象权限。使用guardian这是可能的,但是在管理界面中的对象权限表单中,字段是一个TextField。我如何使它成为一个ChoiceField所有现有的组作为选择

是否有一种解决方案只需要在应用程序的admin.py文件中添加代码,还是我们必须覆盖一些guardian代码?我们如何在不影响guardian功能的情况下做到这一点? 这是我的admin.py文件:

from django.contrib import admin
from .models import MyModel
from guardian.admin import GuardedModelAdmin

class MyModelAdmin(GuardedModelAdmin):
    pass


admin.site.register(MyModel, MyModelAdmin)

Tags: 文件项目对象django代码frompyimport
1条回答
网友
1楼 · 发布于 2024-05-14 09:04:30

这是一个非常有效的解决方案。 GuardedModelAdminMixin的第一个子类

from guardian.admin import GuardedModelAdmin, GuardedModelAdminMixin

class CustomGuardedModelAdminMixin(GuardedModelAdminMixin):
    def get_obj_perms_group_select_form(self, request):
        """
        Returns form class for selecting a group for permissions management.  By default :form:`GroupManage` is
        returned. This enhancement returns GroupModelManage instead, allowing admins to get a queryset of groups.
        """
        return GroupModelManage

然后通过覆盖clean_group函数为组定义ModelManager:

class GroupModelManage(forms.Form):
    """
    Extends the Django Guardian GroupManage class to select User from a query containing all
    User objects rather than a blank input CharField.
    """
    group = forms.ModelChoiceField(queryset=Group.objects.all())

    def clean_group(self):
        """
        Returns ``Group`` instance based on the given group name.
        """
        try:
            return self.cleaned_data['group']
        except Group.DoesNotExist:
            raise forms.ValidationError(self.fields['group'].error_messages['does_not_exist'])

最后,在Admin类中使用新的Mixin:

class MyModelAdmin(CustomGuardedModelAdminMixin, admin.ModelAdmin):
    pass

admin.site.register(MyModel, MyModelAdmin)

要在用户级别执行自定义查询集,请在新的mixin中使用此函数:

    def get_obj_perms_user_select_form(self, request):
        return UserModelManage

这里有一个完整的例子:LINK

相关问题 更多 >

    热门问题