如何在django中的项目设置期间创建组并分配权限?

Say*_*Das 5 python django

我知道我可以创建用户组并从django项目的管理区域为他们分配权限.我还可以通过从django的auth模块导入GroupPermission建模来创建一个组并为其分配权限.

在设置项目时,如果有任何方法可以创建组并为其分配权限,我想知道什么.所以,如果我有类型的用户,Admin,Developer,TesterProject Manager.它们基本上是具有不同权限级别的用户组.我没有自定义User模型,只能区分它们所分配的组.那么有没有办法创建这些组并为它们分配所需的权限,例如在我运行时为admin创建权限时python manage.py migrate

nar*_*ary 7

您可以定义post_migrate信号以创建必需UserGroup模型实例(如果它们尚不存在).

在使用中创建应用程序时python manage.py startapp <app_name>,它会AppConfig在apps.py文件中创建一个类.

您可以指定在AppConfig类定义中调用哪个信号.说信号被调用populate_models.在这种情况下,修改AppConfig如下所示:

from django.apps import AppConfig
from django.db.models.signals import post_migrate

class AppConfig(AppConfig):
    name = 'app'

    def ready(self):
        from .signals import populate_models
        post_migrate.connect(populate_models, sender=self)
Run Code Online (Sandbox Code Playgroud)

并在signals.py中定义populate_models函数.

def populate_models(sender, **kwargs):
    from django.contrib.auth.models import User
    from django.contrib.auth.models import group
    # create groups
    # assign permissions to groups
    # create users
Run Code Online (Sandbox Code Playgroud)

  • 不能保证这个 `post_migrate` 处理程序会在创建权限的 `django.contrib.auth` 定义的处理程序之后运行。因此,此代码可以运行,并且没有分配给组的权限。 (2认同)

Ham*_*iou 6

根据 @narenda-choudhary 和 @Rolando Cruz 的回答,

以下是将应用程序的所有现有权限添加到组下的代码。例如,如果您有 App1 和 App2,并且您想要自动创建 2 个名为 app1 和 app2 的组(分别包含对每个应用程序的模型的权限),请尝试以下操作:

对于 apps.py 上的 App1:

from django.apps import AppConfig
from django.db.models.signals import post_migrate

class App1Config(AppConfig):
    name = 'app1'

    def ready(self):
        from .signals import populate_models
        post_migrate.connect(populate_models, sender=self)
Run Code Online (Sandbox Code Playgroud)

创建一个包含以下内容的 signal.py 文件:

def populate_models(sender, **kwargs):
    from django.apps import apps
    from .apps import App1Config
    from django.contrib.auth.models import Group, Permission
    from django.contrib.contenttypes.models import ContentType

    group_app, created = Group.objects.get_or_create(name=App1Config.name)

    models = apps.all_models[App1Config.name]
    for model in models:
        content_type = ContentType.objects.get(
            app_label=App1Config.name,
            model=model
        )
        permissions = Permission.objects.filter(content_type=content_type)
        group_app.permissions.add(*permissions)
Run Code Online (Sandbox Code Playgroud)

对 App2 执行相同操作

然后将用户分配到他们的组。

用途:

在每个应用程序上创建一个名为 requests.py 的文件并添加:

from .apps import App1Config

def is_in_group_app1(user):
    return user.groups.filter(name=App1Config.name).exists() 
Run Code Online (Sandbox Code Playgroud)

在views.py中使用:

from django.contrib.auth.decorators import login_required, user_passes_test
from .permissions import is_in_group_app1

@login_required(login_url='where_to_redirect')
@user_passes_test(is_in_group_app1) 
def myview(request):
    # Do your processing
Run Code Online (Sandbox Code Playgroud)

对于CBV:

@method_decorator(user_passes_test(is_in_group_app1), name='dispatch')
class LogListView(ListView):
    """ Displays all logs saved on App1 """
    model= Logger.objects.order_by('-date_created')
Run Code Online (Sandbox Code Playgroud)

创建一个名为 templatestag 的文件夹和子文件夹 app1 以及一个 has_perms.py 文件:

from django import template
from app1.permissions import is_in_group_app1
register = template.Library()

@register.filter
def has_perms(user):
    return is_in_group_app1(user)
Run Code Online (Sandbox Code Playgroud)

在您的模板中:

{% load has_perms %}

{% if request.user|has_perms %}
    <li class="nav-item">
        <a href="{% url 'app1:log' %}" class="nav-link">
            <i class="icon-history"></i>
            <span data-i18n="nav.dash.main">App1 Log</span>
        </a>
    </li>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

我花了一段时间才找到所有这些过程,所以如果它可以帮助其他人:

享受 ;) !