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

How to approve all installed apps permission programmatically in 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 仪表板一样批准权限。喜欢 select 一些权限,然后按提交按钮将这些权限添加到 selected 组。 一定有某种方法可以这样做,因为 django admin 本身就是这样做的。我想知道如何完成这项工作。

Django 自己通过 Group and Permission. The Permission object makes use of a content_type field to refer to the ContentType model [Django-doc] 之间的 ManyToManyField 实现了这一点,它指定了所有模型。

如果您因此想要将具有给定 codename 的权限添加到 Group,您可以使用:

from django.contrib.auth.models import Permission

permission = Permission.odocumentenbjects.get(codename='<i>add_mymodel</i>')

<i>mygroup</i>.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(<i>Foo</i>)
)

<i>mygroup</i>.permissions.add(*permissions)

当然,您也可以创建额外的权限,就像为另一个模型创建对象并将它们添加到组中一样。

您还可以添加所有权限:

from django.contrib.auth.models import Permission

permissions = Permission.objects<b>.all()</b>

<i>mygroup</i>.permissions.add(*permissions)