2013-08-28 4 views
2

В django admin У меня 4 пользователя и супер пользователя. У меня есть пользователи с статусом сотрудников, которые имеют ограниченный доступ и не могут удалять/просматривать/редактировать пользователей, но у администратора есть полномочия над всеми другими пользователями и моделями. Я хочу, чтобы суперпользователь мог получать доступ к данным пользователей и редактировать/изменять/удалять их, но я не хочу, чтобы суперпользователь мог удалять себя. В настоящее время суперпользователь может удалить себя. Есть ли способ отключить суперпользователя удалить себя в django ?? Любая помощь была бы благодарна.Как предотвратить удаление суперпользователя в администраторе Django?

Благодаря

+1

Вы можете переопределить администратор для своей модели пользователя и поднять исключение, если обнаружите, что суперпользователь пытается удалить себя. –

ответ

7

НЕ ИСПОЛЬЗОВАТЬ has_delete_permission() переопределение, поскольку это не вызывается на каждом объекте когда вы выполняете действие удаления из списка изменений.

Используйте сигналы, чтобы сделать это. Добавьте это в любые модели.py

from django.db.models.signals import pre_delete 
from django.dispatch.dispatcher import receiver 
from django.contrib.auth.models import User 
from django.core.exceptions import PermissionDenied 

@receiver(pre_delete, sender=User) 
def delete_user(sender, instance, **kwargs): 
    if instance.is_superuser: 
     raise PermissionDenied 

Единственным недостатком этого метода является то, что никто не сможет удалить любого суперпользователя. Перед тем, как удалить его, вам необходимо установить атрибут «is_superuser» для пользователей.

+0

да, спасибо, это сработало для меня ... в конце он показал 403, если суперпользователь пытался удалить себя. –

1

Вы можете попробовать переопределить UserAdmin так, что он не позволит удалить, как документально here:

from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.models import User 

class MyUserAdmin(UserAdmin): 

    def has_delete_permission(self, request, obj=None): 
     if obj is None: 
      return True 
     else: 
      return not obj.is_superuser 

admin.site.unregister(User) 
admin.site.register(User, MyUserAdmin) 
+0

Это не работает !!!! Попробуйте себя, и вы увидите! – Simanas

+0

Кажется, что Django вызывает эту функцию только для определения того, отображается ли кнопка «Удалить» или нет. Когда вы выбираете пользователя из списка и удаляете сразу несколько, функция вызывается с помощью 'obj = None'. Вы можете либо запретить удаление из списка, возвращая 'False', когда' obj = None', либо скрывающие суперпользователи, переопределяющие функцию 'queryset' (' get_queryset' в Django 1.6). –

+0

Да, это то, что я имел в виду;) – Simanas