在Django中添加新的自定义权限

use*_*478 70 django django-south django-permissions

我在我的Django模型中使用自定义权限,如下所示:

class T21Turma(models.Model):
    class Meta:
        permissions = (("can_view_boletim", "Can view boletim"),
                       ("can_view_mensalidades", "Can view mensalidades"),)
Run Code Online (Sandbox Code Playgroud)

问题是,当我向列表添加权限auth_permission时,当我运行syncdb时,它不会被添加到表中.我究竟做错了什么.如果它有任何区别我在南方使用数据库迁移.

Dan*_*aab 59

South不跟踪django.contrib.auth权限.有关更多信息,请参见#211票证.

票证上的一条评论表明,使用--allsyncdb上的选项可以解决问题.

  • 这是在我升级到南0.6.2(我之前运行0.5)后才起作用的. (5认同)

gue*_*tli 48

如果您希望"manage.py migrate"执行所有操作(不调用syncdb --all).您需要使用迁移创建新权限:

user@host> manage.py datamigration myapp add_perm_foo --freeze=contenttypes --freeze=auth
Run Code Online (Sandbox Code Playgroud)

编辑创建的文件:

class Migration(DataMigration):

    def forwards(self, orm):
        "Write your forwards methods here."
        ct, created = orm['contenttypes.ContentType'].objects.get_or_create(
            model='mymodel', app_label='myapp') # model must be lowercase!
        perm, created = orm['auth.permission'].objects.get_or_create(
            content_type=ct, codename='mymodel_foo', defaults=dict(name=u'Verbose Name'))
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在使用此方法,则需要将选项`--freeze = contenttypes --freeze = auth`添加到datamigration命令.否则你会得到@balmaster提到的错误.例如:`manage.py datamigration myapp add_perm_foo --freeze = contenttypes --freeze = auth` (5认同)
  • 不需要最后三行,可以使用`get_or_create`的`defaults`关键字参数代替[link](https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db .models.query.QuerySet.get_or_create) (2认同)

wou*_*dnt 27

这对我有用:

./manage.py update_permissions
Run Code Online (Sandbox Code Playgroud)

这是一个django扩展的事情.


Veb*_*osa 20

您可以连接到post_migrate信号,以便在迁移后更新权限.我使用以下代码,稍微修改了Dev with Passion,最初来自django-extensions.

# Add to your project-level __init__.py

from south.signals import post_migrate

def update_permissions_after_migration(app,**kwargs):
    """
    Update app permission just after every migration.
    This is based on app django_extensions update_permissions management command.
    """
    from django.conf import settings
    from django.db.models import get_app, get_models
    from django.contrib.auth.management import create_permissions

    create_permissions(get_app(app), get_models(), 2 if settings.DEBUG else 0)

post_migrate.connect(update_permissions_after_migration)
Run Code Online (Sandbox Code Playgroud)