我知道我可以在django项目的管理区域创建用户组并为其分配权限。我还可以通过从django的auth模块导入Group
和Permission
模型来创建一个组并为其分配权限。
在设置项目时,如果有任何方法可以创建组并为其分配权限,我想知道什么。因此,如果我有类型的用户,管理员,开发人员,测试人员和项目经理。它们基本上是具有不同权限级别的用户组。我没有自定义User
模型,只能区分它们所分配的组。那么有没有办法创建这些组并为他们分配所需的权限,例如在我运行python manage.py migrate
时为admin创建权限时?
答案 0 :(得分:7)
您可以定义post_migrate
信号,以创建必需的User
和Group
模型实例(如果它们尚不存在)。
使用python manage.py startapp <app_name>
创建应用程序时,它会在apps.py文件中创建一个AppConfig
类。
您可以在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)
在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
答案 1 :(得分:1)
这是用于在组下添加应用程序的所有现有权限的代码。 例如,如果您拥有App1和App2,并且要自动创建2个名为app1和app2的组,分别包含对每个应用程序模型的权限,请尝试以下操作:
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)
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)
对App2执行相同操作
然后将用户分配到他们的组。
用法:
from .apps import App1Config
def is_in_group_app1(user):
return user.groups.filter(name=App1Config.name).exists()
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
对于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')
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)
{% 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 %}
花了我一段时间才能找到所有这些过程,所以如果它可以帮助其他人: