如何在Django中以编程方式批准所有已安装的应用程序权限

问题描述

settings.py

INSTALLED_APPS = [
    'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','django.contrib.sites',# Local apps
    'users.apps.UsersConfig',# Third party apps
    'allauth','allauth.account','allauth.socialaccount',]

views.py


@user_passes_test(lambda u: u.is_superuser)
def create_group(request):
    groups = Group.objects.all()
    if request.method == 'POST':
        group_name = request.POST.get('group_name')
        group = Group.objects.create(name=group_name)
        return HttpResponse(group.name)
    else:
        ctx = {'groups': groups}
        return render(request,'users/admin/create_group.html',ctx)

在这里,我已经创建了一个用于以编程方式创建用户组的视图。现在,我想允许用户像django-admin仪表板一样批准权限。就像选择几个权限,然后按提交按钮将这些权限添加到所选组中。 必须采取某种方式,因为django管理员本身就是这样做的。我想了解一些如何完成此工作的想法。

解决方法

Django通过在GroupPermission之间使用ManyToManyField来实现此目的。 Permission对象利用content_type字段来引用指定所有模型的ContentType model [Django-doc]

如果因此要向codename添加具有给定Group的权限,则可以使用:

from django.contrib.auth.models import Permission

permission = Permission.odocumentenbjects.get(codename='add_mymodel')

mygroup.permissions.add(permission)

或者例如,如果您想添加给定模型 Foo 的所有权限,则可以使用:

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

permissions = Permission.objects.filter(
    content_type=ContentType.objects.get_for_model(Foo)
)

mygroup.permissions.add(*permissions)

您还可以创建额外的权限,就像为其他模型创建对象并将它们添加到组中一样。

您还可以使用以下方法添加所有权限:

from django.contrib.auth.models import Permission

permissions = Permission.objects.all()

mygroup.permissions.add(*permissions)