Стандартно в Django для модели создаются три роли: «добавить», «редактировать», «удалять».
Но как же быть, если мы хотим дать роль пользователю только на просмотр и при этом использовать django.admin
?
Есть множество способов, но элегантных, которые позволили бы создать роль «Can view model» практически нет.
И так, вот рецепт:
Создадим новый сигнал
from django.db.models.signals import post_migrate
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission
def add_view_permissions(sender, **kwargs):
"""
Add view permissions
"""
for content_type in ContentType.objects.all():
codename = "view_%s" % content_type.model
if not Permission.objects.filter(content_type=content_type, codename=codename):
Permission.objects.create(content_type=content_type, codename=codename,
name="Can view %s" % content_type.name)
post_migrate.connect(add_view_permissions)
При миграции, наш сигнал будет каждый раз проверять и создавать роль view_
для новой модели.
Создадим наследуемый класс для admin.ModelAdmin
from django.contrib import admin
class AdminMixin(admin.ModelAdmin):
def has_change_permission(self, request, obj=None):
change_permission = super(AdminMixin, self).has_change_permission(request, obj)
if change_permission:
self.readonly_fields = AdminMixin.readonly_fields
return True
if request.user.has_perm('{}.view_{}'.format(self.model._meta.app_label, self.model._meta.object_name)):
self.readonly_fields = self._meta.get_all_field_names()
return True
return False
Вот и все.
Теперь, пользователи, у которых будет роль только view, смогут лишь просматривать объекты в django.admin
.