gpt4 book ai didi

django - 以编程方式向组添加权限的正确方法是什么

转载 作者:行者123 更新时间:2023-12-04 16:11:24 24 4
gpt4 key购买 nike

我想向组添加(已经存在,通过元标记中的权限定义)权限并寻找正确的位置。我必须确保在 sync_db 命令之后所有组都分配了正确的权限。

我想连接一个 post_syncdb 信号,但信号文档说:

It is important that handlers of this signal perform idempotent changes (e.g. no database alterations) as this may cause the flush management command to fail if it also ran during the syncdb command.



因此,在通过 sync_db_post 信号调用的管理命令中向组添加权限可能是不可取的。

我计划设置这样的权限:
class UserProfile(models.Model):
user = models.OneToOneField(User)
company = models.ForeignKey(Company, related_name='user_profiles')
department = models.ForeignKey(Department, related_name='user_profiles')

class Meta:
permissions = (
('admin_section_access', 'Access to front-end admin section'),
)

在管理命令中:
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType


class Command(BaseCommand):
args = 'none'
help = 'Sets the defined group permissions'

def handle(self, *args, **options):
front_end_admin_group, created = Group.objects.get_or_create(name="Front End Admin")

#get the content type for the UserProfile model
user_profile_ct = ContentType.objects.get(app_label='organization', model='userprofile')
admin_section_access_perm = Permission.objects.get(content_type=user_profile_ct, codename="admin_section_access")
front_end_admin_group.permissions.add(admin_section_access_perm)
self.stdout.write('Successfully setup group permissions.')

最佳答案

您在这里有两个主要选择。首先是为您的数据库创建一个夹具,如 here 所述。在 Django 文档中。这是将数据(对您而言,权限外部参照记录)播种到数据库中的最古老方法。

第二个选项,我比第一个更喜欢,是使用 South以编程方式跟踪和维护对数据库的更改。虽然最常用于架构更改,但其 data migrations功能是处理您想要的东西的理想场所。您可以在命令行中运行它:./manage.py datamigration my_app seed_permissions然后只需在提供的 forwards 中编写获取权限所需的 Django 代码功能。

第二个选项的主要问题是它要求您运行 migrate 的附加命令。后 sync_db ,但这可能是不可避免的,因为 South 是事实(并计划在 1.7 中成为核心 Django)。

关于django - 以编程方式向组添加权限的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14436740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com