19

django では、syncdb が django.contrib.auth がインストールされた状態で実行されると、デフォルトで各モデルにデフォルトのパーミッションが作成されます... foo.can_change 、 foo.can_delete 、 foo.can_add など。モデルにカスタム権限を追加するには、クラス Meta: をモデルの下に追加し、そこで権限を定義します

私の質問は、User モデルにカスタム権限を追加したい場合はどうすればよいですか? foo.can_view のように。次のスニペットでこれを行うことができます。

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

しかし、syncdb でうまく機能するものが必要です。たとえば、カスタム モデルのクラス Meta です。ユーザーモデルを拡張する方法であるため、これらを UserProfile の下のクラス Meta: に含める必要があります。しかし、それは正しい方法ですか?それは UserProfile モデルに結び付けられませんか?

4

4 に答える 4

7

次のようなことができます。

__init__.pyDjango アプリの に次を追加します。

from django.db.models.signals import post_syncdb
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth import models as auth_models
from django.contrib.auth.models import Permission

# custom user related permissions
def add_user_permissions(sender, **kwargs):
    ct = ContentType.objects.get(app_label='auth', model='user')
    perm, created = Permission.objects.get_or_create(codename='can_view', name='Can View Users', content_type=ct)
post_syncdb.connect(add_user_permissions, sender=auth_models)
于 2012-11-13T12:30:09.523 に答える
4

ここに「正しい」答えがあるとは思いませんが、変更Permission.objects.createしたことを除いてあなたとまったく同じコードを使用Permission.objects.get_or_createし、syncdbと同期するために機能しました

于 2012-03-09T20:17:20.037 に答える
2

Django 1.8 の更新された回答。syncdb は非推奨であり、シグナルがデータベースを変更する場合は代わりに使用することをドキュメントが推奨しているため、シグナルは のpre_migrate代わりに使用されます。また、信号への接続にも使用されます。pre_syncdbpre_migratepost_migrate@receiveradd_user_permissions

from django.db.models.signals import pre_migrate
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth import models as auth_models
from django.contrib.auth.models import Permission
from django.conf import settings
from django.dispatch import receiver


# custom user related permissions
@receiver(pre_migrate, sender=auth_models)
def add_user_permissions(sender, **kwargs):
    content_type = ContentType.objects.get_for_model(settings.AUTH_USER_MODEL)
    Permission.objects.get_or_create(codename='view_user', name='View user', content_type=content_type)
于 2015-08-01T14:42:04.780 に答える