Как добавить права в админпанель django для пользователя?
У меня есть приложение django. И я добавил в административной панели django следующее разрешение:
Accounts | account | Can view account
А в коде файла admin.py приложения учетных записей. Я добавил следующее:
from django.contrib.auth import get_user_model
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from .models import Account
# from .models import *
# Register your models here.
User = get_user_model()
user = User.objects.get(email='n@n.nl')
print(user.has_perm('view_account'))
content_type = ContentType.objects.get_for_model(Account)
permission = Permission.objects.get(
codename='view_account', content_type=content_type)
user.user_permissions.add(permission)
permissions = Permission.objects.filter(content_type=content_type)
for perm in permissions:
print(f"Codename: {perm.codename}, Name: {perm.name}")
print(user)
class AccountAdmin(UserAdmin):
list_display = (
"email",
"first_name",
"last_name",
"username",
"last_login",
"date_joined",
"is_active",
)
list_display_links = ("email", "first_name", "last_name")
filter_horizontal = (
'groups',
'user_permissions',
)
readonly_fields = ("last_login", "date_joined")
ordering = ("-date_joined",)
list_filter = ()
User = get_user_model()
user = User.objects.get(email='n@n.nl')
content_type = ContentType.objects.get_for_model(Account)
permission = Permission.objects.get(
codename='view_account', content_type=content_type)
user.user_permissions.add(permission)
admin.site.register(Account, AccountAdmin)
А когда я запускаю приложение django. я не получаю никаких ошибок.
Но когда я вхожу в систему с учетной записью с правами пользователя. Я все еще вижу сообщение:
У вас нет прав на просмотр или редактирование чего-либо.
А разрешения:
- Является активным
- Является персоналом выбран
Вопрос: как добавить права для пользователей?
Вам не предоставлена Account
модель, но я могу представить себе проблему:
Например, у вас есть приложение с именем accounts:
И вы хотите просто переопределить некоторые функции из User
, но не хотите менять модель User
. У вас есть:
#accounts.models
from django.contrib.auth import get_user_model
# Register your models here.
User = get_user_model()
class Account(User):
class Meta:
proxy = True
verbose_name = "Account"
def __str__(self):
return f'I override str {self}'
После этого вы создаете администратора:
#accounts.admin
from django.contrib import admin
from .models import Account
class AccountAdmin(admin.ModelAdmin):
...
pass
admin.site.register(Account, AccountAdmin)
После этого вы добавляете разрешение пользователю:
user, __ = Account.objects.get_or_create(email='n@n.nl', is_staff=True, is_active=True)
content_type = ContentType.objects.get_for_model(Account)
permission = Permission.objects.get(codename='view_account', content_type=content_type)
user.user_permissions.add(permission)
Но если вы увидите на content_type.app_label
, то получите 'auth'
.
И AccountAdmin.options.app_label
-> 'accounts'
Проблема заключается в различных моделях app_label и proxy.
Чтобы увидеть AccountAdmin, вы должны сделать:
ct = ContentType.objects.get_or_create(app_label="accounts", model='account')
perm = Permission.objects.get_or_create(codename='view_account', content_type=content_type)
user.user_permissions.add(perm)
Надеюсь, это поможет.