Domanda

Sono utilizzando autorizzazioni personalizzate nei miei modelli Django in questo modo:

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

Il problema è che quando aggiungo un permesso per la lista non venga aggiunto alla tabella auth_permission quando corro syncdb. Che cosa sto facendo di sbagliato. Se si fa alcuna differenza che sto usando sud per le migrazioni di database.

È stato utile?

Soluzione

Sud non tiene django.contrib.auth permessi. Vedere biglietto # 211 per ulteriori informazioni.

Uno dei commenti sul biglietto suggerisce che utilizzando l'opzione --all su syncdb può risolvere il problema.

Altri suggerimenti

Se si vuole "manage.py migrare" di fare tutto (senza chiamare syncdb --all). È necessario creare nuovi permessi con una migrazione:

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

Modificare il file creato:

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

Questo ha funzionato per me:

./manage.py update_permissions

Si tratta di una href="https://github.com/django-extensions/django-extensions"> django-extensions cosa

È possibile collegare al segnale post_migrate al fine di aggiornare le autorizzazioni dopo la migrazione. Io uso il seguente codice, leggermente modificato da Dev con passione e originario di 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)

Quando ho runnning migrazione con seguente codice

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

I ottenendo seguente errore

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."

Per evitare questo errore, ho modificato il codice

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top