Adding new custom permissions in Django

前端 未结 5 1485
攒了一身酷
攒了一身酷 2021-01-29 22:46

I am using custom permissions in my Django models like this:

class T21Turma(models.Model):
    class Meta:
        permissions = ((\"can_view_boletim\", \"Can vi         


        
相关标签:
5条回答
  • 2021-01-29 23:15

    When i runnning migration with following code

    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 getting folloving error

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

    To prevent this error, i modified the code

    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()
    
    0 讨论(0)
  • 2021-01-29 23:19

    This worked for me:

    ./manage.py update_permissions
    

    It is a django-extensions thing.

    0 讨论(0)
  • 2021-01-29 23:35

    If you want "manage.py migrate" to do everything (without calling syncdb --all). You need to create new permissions with a migration:

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

    Edit the created file:

    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'))
    
    0 讨论(0)
  • 2021-01-29 23:35

    You can connect to the post_migrate signal in order to update the permissions after migration. I use the following code, slightly modified from Dev with Passion and originally from 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)
    
    0 讨论(0)
  • 2021-01-29 23:38

    South does not track django.contrib.auth permissions. See ticket #211 for more information.

    One of the comments on the ticket suggests that using the --all option on syncdb may solve the problem.

    0 讨论(0)
提交回复
热议问题