【问题标题】:How to approve all installed apps permission programmatically in Django如何在 Django 中以编程方式批准所有已安装的应用程序权限
【发布时间】:2020-10-23 21:59:06
【问题描述】:

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 admin 本身就是这样做的。我想知道如何才能完成这项工作。

【问题讨论】:

    标签: python django django-permissions


    【解决方案1】:

    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)

    【讨论】:

    • 嘿,我真的很喜欢这种方法。但我想列出项目中的所有可用权限(不是单个模型,而是项目中的所有模型),然后将它们添加到一个组中。如何获得所有已安装应用的所有权限?
    • @TareqMonwer:你使用Permission.objects.all()
    猜你喜欢
    • 1970-01-01
    • 2015-04-09
    • 2011-06-18
    • 2023-03-03
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多