Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django 1.7将代码放在何处以编程方式添加组?_Python_Django_Django Models_Django Admin - Fatal编程技术网

Python Django 1.7将代码放在何处以编程方式添加组?

Python Django 1.7将代码放在何处以编程方式添加组?,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,我一直试图在Django Auth文档中找到答案,但似乎找不到我想要的 我遇到的问题是,当我定义添加组的代码时(与管理页面中的组相同): 当我在models.py和init.py中运行此代码时,它们都会给我以下错误: django.core.exceptions.AppRegistryNotReady 我想这是因为Model/init试图过早地将内容插入django应用程序/admin 如何以编程方式添加这些组 编辑: 这不是一个重复的问题,这实际上是在项目设置期间在模型中添加权限和组,而不是

我一直试图在Django Auth文档中找到答案,但似乎找不到我想要的

我遇到的问题是,当我定义添加组的代码时(与管理页面中的组相同):

当我在models.py和init.py中运行此代码时,它们都会给我以下错误:

django.core.exceptions.AppRegistryNotReady
我想这是因为Model/init试图过早地将内容插入django应用程序/admin

如何以编程方式添加这些组

编辑:

这不是一个重复的问题,这实际上是在项目设置期间在模型中添加权限和组,而不是通过shell

我已经通过使用信号和接收器(django模块)解决了这个问题

我将创建权限/组的代码添加到它自己的函数中,并用一个接收者(post_migrate)对其进行修饰,该接收者将在迁移完成后运行此函数,从而删除此错误

@receiver(post_migrate)
def init_groups(sender, **kwargs):
    #permission and group code goes here
有人建议我这样做:

在适当的模块中创建假迁移:

python manage.py makemigrations --empty yourappname
打开创建的文件,该文件应如下所示:

# -*- coding: utf-8 -*-
from django.db import models, migrations

class Migration(migrations.Migration):

    dependencies = [
        ('yourappname', '0001_initial'),
    ]

    operations = [
    ]
并添加您的代码:

# -*- coding: utf-8 -*-
from django.db import models, migrations

def add_group_permissions():
    #read_only
    group, created = Group.objects.get_or_create(name='read_only')   
    if created:
        group.permissions.add(can_read_campaign)
        logger.info('read_only_user Group created')

    #standard
    group, created = Group.objects.get_or_create(name='standard_user') 
    if created:
        group.permissions.add(can_edit_users)
        logger.info('standard_user Group created')

    #admin
    group, created = Group.objects.get_or_create(name='admin_user') 
    if created:
        group.permissions.add(can_edit_campaign, can_edit_users)
        logger.info('admin_user Group created')

class Migration(migrations.Migration):

    dependencies = [
        ('yourappname', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(add_group_permissions),
    ]
最后,运行迁移:

python manage.py migrate

这很好,因为您可以部署到Heroku或任何地方,并确保它将被应用,因为这只是另一个迁移。

将@Robert Grant和我结合起来,可以像这样做:

python manage.py makemigrations --empty yourappname
然后:

from django.contrib.auth.models import Group, Permission
from django.db import models, migrations
import logging


logger = logging.getLogger(__name__)

campaign_group_permissions = {
  "Campaign Manager": [
    "add_campaign",
    "change_campaign",
    "delete_campaign",
    "view_campaign",
    "add_campaignsms",
    "add_sending",
    "change_sending",
    "view_sending"
  ]
}


def add_group_permissions():
    # See https://code.djangoproject.com/ticket/23422
    db_alias = schema_editor.connection.alias
    try:
        emit_post_migrate_signal(2, False, 'default')
    except TypeError:  # Django < 1.8
        emit_post_migrate_signal([], 2, False, 'default', db_alias)

    for group in campaign_group_permissions:
        role, created = Group.objects.get_or_create(name=group)
        logger.info(f'{group} Group created')
        for perm in campaign_group_permissions[group]:
            role.permissions.add(Permission.objects.get(codename=perm))
            logger.info(f'Permitting {group} to {perm}')
        role.save()


class Migration(migrations.Migration):

    dependencies = [
        ('yourappname', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(add_group_permissions),
    ]
来自django.contrib.auth.models导入组,权限
从django.db导入模型、迁移
导入日志记录
logger=logging.getLogger(_名称__)
活动组权限={
“活动经理”:[
“添加_活动”,
“变革运动”,
“删除活动”,
“查看运动”,
“添加短信”,
“添加发送”,
“更改发送”,
“查看发送”
]
}
def添加组权限():
#看https://code.djangoproject.com/ticket/23422
db_alias=schema_editor.connection.alias
尝试:
发出后迁移信号(2,假,“默认值”)
除类型错误外:#Django<1.8
发出后迁移信号([],2,False,“default”,db\u别名)
对于活动组权限中的组:
角色,已创建=组。对象。获取或创建(名称=组)
info(f'{group}group created')
对于活动\组\权限[组]中的perm:
role.permissions.add(Permission.objects.get(codename=perm))
info(f'allowing{group}to{perm})
role.save()
类迁移(migrations.Migration):
依赖项=[
('yourappname','0001_首字母'),
]
操作=[
RunPython(添加组权限),
]

注意:这在Django 3.x上有效,但我很确定它也适用于Django 1.7。

@Ruloweb的出色响应几乎对我有效,但我不得不做一些调整,使其在Django 3.1中与多个应用程序一起工作

首先,我需要向add_group_permissions()函数添加参数。我还需要导入emit_post_migration_信号:

from django.contrib.auth.models import Group, Permission
from django.core.management.sql import emit_post_migrate_signal # <-- Added this
from django.db import models, migrations
import logging

logger = logging.getLogger(__name__)

public_group_permissions = {
  "Your permission group name here": ['your permissions here']
}

def add_group_permissions(apps, schema_editor): # <-- updated this

    # See https://code.djangoproject.com/ticket/23422
    db_alias = schema_editor.connection.alias

    try:
        emit_post_migrate_signal(2, False, 'default')
    except TypeError:  # Django < 1.8
        emit_post_migrate_signal([], 2, False, 'default', db_alias)

    for group in public_group_permissions:
        role, created = Group.objects.get_or_create(name=group)
        logger.info(f'{group} Group created')
        for perm in public_group_permissions[group]:
            role.permissions.add(Permission.objects.get(codename=perm))
            logger.info(f'Permitting {group} to {perm}')
        role.save()


class Migration(migrations.Migration):

    dependencies = [
        ('your_app_name', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(add_group_permissions),
    ]
来自django.contrib.auth.models导入组,权限

从django.core.management.sql导入emit_post_migrate_signal#您需要调用函数。我会以重复的方式结束这个问题-让我们知道它是否真的不止这些。Hi@alecxe这不是一个重复的问题,我为您提供了一个编辑。回答很好,非常简洁。只是一个改进:def create_group(name,perms=[]):group,created=group.objects.get_或_create(name=name)如果创建:在Django 1.8中,对于perms中的perm:group.permissions.add(perm)logger.info(“group\”+name+“\”created”),我必须在这个答案中添加两个内容:
来自Django.contrib.auth.models导入组
,或者它抱怨没有定义组。然后函数定义需要两个参数:
def add_group_permissions(应用程序、架构编辑器):
。在django 1.9.5中,在迁移期间尝试获取权限会导致错误。
from django.contrib.auth.models import Group, Permission
from django.core.management.sql import emit_post_migrate_signal # <-- Added this
from django.db import models, migrations
import logging

logger = logging.getLogger(__name__)

public_group_permissions = {
  "Your permission group name here": ['your permissions here']
}

def add_group_permissions(apps, schema_editor): # <-- updated this

    # See https://code.djangoproject.com/ticket/23422
    db_alias = schema_editor.connection.alias

    try:
        emit_post_migrate_signal(2, False, 'default')
    except TypeError:  # Django < 1.8
        emit_post_migrate_signal([], 2, False, 'default', db_alias)

    for group in public_group_permissions:
        role, created = Group.objects.get_or_create(name=group)
        logger.info(f'{group} Group created')
        for perm in public_group_permissions[group]:
            role.permissions.add(Permission.objects.get(codename=perm))
            logger.info(f'Permitting {group} to {perm}')
        role.save()


class Migration(migrations.Migration):

    dependencies = [
        ('your_app_name', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(add_group_permissions),
    ]