in django by default when syncdb is run with django.contrib.auth installed, it creates default permissions on each model... like foo.can_change , foo.can_delete and foo.can_add. To add custom permissions to models one can add class Meta: under the model and define permissions there, as explained here https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions
My question is that what should I do if I want to add a custom permission to the User model? like foo.can_view. I could do this with the following snippet,
ct = ContentType.objects.get(app_label='auth', model='user')
perm = Permission.objects.create(codename='can_view', name='Can View Users',
content_type=ct)
perm.save()
But I want something that plays nicely with syncdb, for example the class Meta under my custom models. Should I just have these in class Meta: under UserProfile since that is the way to extend the user model. but is that the RIGHT way to do it? Wouldn't that tie it to UserProfile model?
An updated answer for Django 1.8. The signal
pre_migrate
is used instead ofpre_syncdb
, since syncdb is deprecated and the docs recommend usingpre_migrate
instead ofpost_migrate
if the signal will alter the database. Also,@receiver
is used to connectadd_user_permissions
to the signal.I don't think there is a "right" answer here, but i used the exact same code as you except i changed
Permission.objects.create
toPermission.objects.get_or_create
and that worked find to sync with syncdbYou could do something like this:
in the
__init__.py
of your Django app add: