如何使用 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
在 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