Tho*_*mel 6 django permissions
我想添加(已经存在,通过元标记中的权限定义)对组的权限并寻找正确的位置来执行此操作.我必须确保在sync_db命令之后所有组都分配了正确的权限.
我想连接一个post_syncdb信号,但信号docs说:
重要的是此信号的处理程序执行幂等更改(例如,不进行数据库更改),因为如果它在syncdb命令期间也运行,则可能导致刷新管理命令失败.
因此,可能不建议有人在通过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'),
)
Run Code Online (Sandbox Code Playgroud)
在管理命令中:
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.')
Run Code Online (Sandbox Code Playgroud)
这里有两个主要选择。第一个是为您的数据库创建一个固定装置,如Django 文档中所述。这是将数据(对您而言,权限外部参照记录)植入数据库的最古老的方法。
第二个选项是我比第一个选项更喜欢的,是使用South以编程方式跟踪和维护数据库的更改。虽然最常用于架构更改,但其数据迁移功能是处理您想要的事情的完美场所。您可以在命令行中运行此命令:./manage.py datamigration my_app seed_permissions然后只需编写在提供的函数中获取权限所需的 Django 代码即可forwards。
第二个选项的主要问题是它要求您运行migrateafter的附加命令sync_db,但这可能是不可避免的,因为 South 是事实(并计划在 1.7 中成为 Django 核心)。