以编程方式创建具有权限的django组

Ste*_*lsh 35 django permissions

在管理控制台中,我可以添加一个组并添加一组与我的模型相关的权限,例如

api | project | Can add project
api | project | Can change project
api | project | Can delete project
Run Code Online (Sandbox Code Playgroud)

我该如何以编程方式执行此操作.我找不到有关如何执行此操作的任何信息.

我有:

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

from api.models import Project


new_group, created = Group.objects.get_or_create(name='new_group')
# Code to add permission to group ???
ct = ContentType.objects.get_for_model(Project)
# Now what - Say I want to add 'Can add project' permission to new_group?
Run Code Online (Sandbox Code Playgroud)

更新:感谢您提供的答案.我能够用它来解决我需要的问题.就我而言,我可以做到以下几点:

new_group, created = Group.objects.get_or_create(name='new_group')
proj_add_perm = Permission.objects.get(name='Can add project')
new_group.permissions.add(proj_add_perm)
Run Code Online (Sandbox Code Playgroud)

anu*_*gal 41

使用以下代码

from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from api.models import Project
new_group, created = Group.objects.get_or_create(name='new_group')
# Code to add permission to group ???
ct = ContentType.objects.get_for_model(Project)

# Now what - Say I want to add 'Can add project' permission to new_group?
permission = Permission.objects.create(codename='can_add_project',
                                   name='Can add project',
                                   content_type=ct)
new_group.permissions.add(permission)
Run Code Online (Sandbox Code Playgroud)

  • 我把这段代码放在哪个文件中? (7认同)
  • `/ yourapp/management/commands/anything.py`,确保包含`management/__ init __.py`和`commands/__ init __.py`以便加载. (3认同)
  • 另一种方法是创建数据迁移https://docs.djangoproject.com/en/3.1/topics/migrations/#data-migrations (3认同)

rad*_*tek 18

我需要为这些组创建一组默认的组和权限(仅查看).我想出了一个可能对其他人有用的manage.py命令(create_groups.py).您可以将它添加到您的<app>/management/commands目录,然后通过manage.py create_groups以下方式运行:

"""
Create permission groups
Create permissions (read only) to models for a set of groups
"""
import logging

from django.core.management.base import BaseCommand
from django.contrib.auth.models import Group
from django.contrib.auth.models import Permission

GROUPS = ['developers', 'devops', 'qa', 'operators', 'product']
MODELS = ['video', 'article', 'license', 'list', 'page', 'client']
PERMISSIONS = ['view', ]  # For now only view permission by default for all, others include add, delete, change


class Command(BaseCommand):
    help = 'Creates read only default permission groups for users'

    def handle(self, *args, **options):
        for group in GROUPS:
            new_group, created = Group.objects.get_or_create(name=group)
            for model in MODELS:
                for permission in PERMISSIONS:
                    name = 'Can {} {}'.format(permission, model)
                    print("Creating {}".format(name))

                    try:
                        model_add_perm = Permission.objects.get(name=name)
                    except Permission.DoesNotExist:
                        logging.warning("Permission not found with name '{}'.".format(name))
                        continue

                    new_group.permissions.add(model_add_perm)

        print("Created default group and permissions.")
Run Code Online (Sandbox Code Playgroud)

  • 那真的很有帮助 (2认同)
  • 请注意,如果在您的模型上指定,模型名称将根据 `verbose_name` 更改。 (2认同)

Pav*_*vel 14

受 radtek 回答的启发,我创建了一个更好的版本(在我看来)。它允许将模型指定为对象(而不是字符串)并在一个字典(而不是多个列表)中指定所有配置

# backend/management/commands/initgroups.py
from django.core.management import BaseCommand
from django.contrib.auth.models import Group, Permission

from backend import models

GROUPS_PERMISSIONS = {
    'ConnectionAdmins': {
        models.StaticCredentials: ['add', 'change', 'delete', 'view'],
        models.NamedCredentials: ['add', 'change', 'delete', 'view'],
        models.Folder: ['add', 'change', 'delete', 'view'],
        models.AppSettings: ['view'],
    },
}

class Command(BaseCommand):
    def __init__(self, *args, **kwargs):
        super(Command, self).__init__(*args, **kwargs)

    help = "Create default groups"

    def handle(self, *args, **options):
        # Loop groups
        for group_name in GROUPS_PERMISSIONS:

            # Get or create group
            group, created = Group.objects.get_or_create(name=group_name)

            # Loop models in group
            for model_cls in GROUPS_PERMISSIONS[group_name]:

                # Loop permissions in group/model
                for perm_index, perm_name in \
                        enumerate(GROUPS_PERMISSIONS[group_name][model_cls]):

                    # Generate permission name as Django would generate it
                    codename = perm_name + "_" + model_cls._meta.model_name

                    try:
                        # Find permission object and add to group
                        perm = Permission.objects.get(codename=codename)
                        group.permissions.add(perm)
                        self.stdout.write("Adding "
                                          + codename
                                          + " to group "
                                          + group.__str__())
                    except Permission.DoesNotExist:
                        self.stdout.write(codename + " not found")
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。您还应该过滤 content_type,以防不同的应用程序使用相同的 model_name。所以: perm = Permission.objects.get(codename=codename, content_type=content_type),其中: content_type = ContentType.objects.get(app_label=app_label, model=model_name) (2认同)

VMM*_*MMF 5

从@radtek 和@Pavel 的答案中汲取灵感,我创建了自己的 create_groups.py 版本,我使用 python 调用它manage.py create_groups。该文件存储在app_name/management/commands/create_groups.py. 我__init__.py在每个管理和命令文件夹中创建了一个。

我创造了单独控制每个模型权限的可能性,因为我有一组名为Member的用户,它们必须对不同的模型具有不同的权限。我还添加了使用电子邮件和默认密码创建用户的可能性,之后必须更改这些用户并将它们与某个组关联。

from django.core.management import BaseCommand
from django.contrib.auth.models import User, Group , Permission
import logging

GROUPS = {
    "Administration": {
        #general permissions
        "log entry" : ["add","delete","change","view"],
        "group" : ["add","delete","change","view"],
        "permission" : ["add","delete","change","view"],
        "user" : ["add","delete","change","view"],
        "content type" : ["add","delete","change","view"],
        "session" : ["add","delete","change","view"],

        #django app model specific permissions
        "project" : ["add","delete","change","view"],
        "order" : ["add","delete","change","view"],
        "staff time sheet" : ["add","delete","change","view"],
        "staff" : ["add","delete","change","view"],
        "client" : ["add","delete","change","view"],       
    },

    "Member": {
        #django app model specific permissions
        "project" : ["view"],
        "order" : ["view"],
        "staff time sheet" : ["add","delete","change","view"],
    },
}


USERS = {
    "my_member_user" : ["Member","member@domain.cu","1234*"],
    "my_admin_user" :  ["Administration","admin@domain.ca","1234"],
    "Admin" : ["Administration","superuser@domain.cu","1234"],
}

class Command(BaseCommand):

    help = "Creates read only default permission groups for users"

    def handle(self, *args, **options):

        for group_name in GROUPS:

            new_group, created = Group.objects.get_or_create(name=group_name)

            # Loop models in group
            for app_model in GROUPS[group_name]:

                # Loop permissions in group/model
                for permission_name in GROUPS[group_name][app_model]:

                    # Generate permission name as Django would generate it
                    name = "Can {} {}".format(permission_name, app_model)
                    print("Creating {}".format(name))

                    try:
                        model_add_perm = Permission.objects.get(name=name)
                    except Permission.DoesNotExist:
                        logging.warning("Permission not found with name '{}'.".format(name))
                        continue

                    new_group.permissions.add(model_add_perm)


            for user_name in USERS:

                new_user = None
                if user_name == "Admin":
                    new_user, created = User.objects.get_or_create(username=user_name,is_staff = True,is_superuser = True, email = USERS[user_name][1])
                else:
                    new_user, created = User.objects.get_or_create(username=user_name,is_staff = True, email = USERS[user_name][1])

                new_user.set_password(USERS[user_name][2])
                new_user.save()

                if USERS[user_name][0] == str(new_group):

                    new_group.user_set.add(new_user)

                    print("Adding {} to {}".format(user_name,new_group))
Run Code Online (Sandbox Code Playgroud)