web-dev-qa-db-ja.com

Djangoに新しいカスタム許可を追加する

私のDjangoモデルでカスタム許可を使用しています:

_class T21Turma(models.Model):
    class Meta:
        permissions = (("can_view_boletim", "Can view boletim"),
                       ("can_view_mensalidades", "Can view mensalidades"),)
_

問題は、syncdbを実行しても、リストに許可を追加しても_auth_permission_テーブルに追加されないことです。私は何を間違えていますか。違いがあれば、データベースの移行にsouthを使用しています。

70
user27478

SouthはDjango.contrib.auth許可を追跡しません。詳細については、 ticket#211 を参照してください。

チケットに関するコメントの1つは、syncdbで--allオプションを使用すると問題が解決する可能性があることを示唆しています。

59
Daniel Naab

「manage.py migrate」ですべてを実行する場合(syncdb --allを呼び出さずに)。移行で新しい権限を作成する必要があります。

user@Host> manage.py datamigration myapp add_perm_foo --freeze=contenttypes --freeze=auth

作成したファイルを編集します。

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'))
48
guettli

これは私のために働いた:

./manage.py update_permissions

Django-extensions のことです。

27
wouldnt

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)
20
Vebjorn Ljosa

次のコードで移行を実行しているとき

ct, created = orm['contenttypes.ContentType'].objects.get_or_create(model='mymodel',     app_label='myapp') # model must bei lowercase!
perm, created = orm['auth.permission'].objects.get_or_create(content_type=ct, codename='mymodel_foo')

次のエラーが表示されます

File "C:\Python26\lib\site-packages\south-0.7.3-py2.6.Egg\south\orm.py", line 170, in  __getitem__
raise KeyError("The model '%s' from the app '%s' is not available in this migration." % (model, app))
KeyError: "The model 'contenttype' from the app 'contenttypes' is not available in this migration."

このエラーを防ぐために、コードを修正しました

from Django.contrib.contenttypes.models import ContentType
from Django.contrib.auth.models import Permission

class Migration(DataMigration):

    def forwards(self, orm):
        "Write your forwards methods here."
        ct = ContentType.objects.get(model='mymodel', app_label='myapp') 
        perm, created = Permission.objects.get_or_create(content_type=ct, codename='mymodel_foo')
        if created:
            perm.name=u'my permission description'
            perm.save()
2
balmaster