如何使用 django-guardian 在管理界面的对象权限表单中添加组选择?

How to add group choices in the Object Permissions form of the admin interface with django-guardian?

django 项目中使用 guardian,我希望管理员能够通过管理界面分配对象权限。使用 guardian 这是可能的,但是管理界面中的 Object permissions 表单,Group 字段是 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)

这是一个非常有效的解决方案。 先subclass 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 函数为组定义模型管理器:

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'])

最后,在您的管理员中使用新的 Mixin class:

class MyModelAdmin(CustomGuardedModelAdminMixin, admin.ModelAdmin):
    pass

admin.site.register(MyModel, MyModelAdmin)

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

    def get_obj_perms_user_select_form(self, request):
        return UserModelManage

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