2013-08-28 2 views
2

django 관리자에는 4 명의 사용자와 수퍼 유저가 있습니다. 제한된 액세스 권한을 갖고 사용자를 삭제 /보기/편집 할 수 없지만 관리자는 모든 다른 사용자 및 모델에 대한 권한을 가진 스태프 상태의 사용자가 있습니다. 수퍼 유저가 사용자 데이터에 액세스하여 수정/수정/삭제할 수있게하려면 수퍼 유저가 자신을 삭제하지 못하도록하고 싶습니다. 현재 수퍼 유저는 자신을 삭제할 수 있습니다. django에서 수퍼 유저 삭제 자체/자신을 비활성화하는 방법이 있습니까? 어떤 도움이라도 감사 할 것입니다.Django 관리자에서 수퍼 유저 삭제를 방지하는 방법은 무엇입니까?

감사

+1

수퍼 유저가 자신을 삭제하려고 시도하는 것을 감지하면 사용자 모델의 관리자를 무시하고 예외를 발생시킬 수 있습니다. –

답변

7

이 모든 객체에 호출되는되지 않는 has_delete_permission() 재정의를 사용하지 마십시오 변경 목록에서 삭제 조치를 수행 할 때

신호를 사용하십시오. any models.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"를 False로 설정해야합니다.

+0

네, 고마워. 나에게 잘 됐어. 결국 수퍼 유저가 자신을 지우려고하면 403이 금지되었다. –

1
당신은 그것을 문서화 here으로 삭제 허용하지 않도록 UserAdmin을 재정의 할 시도 할 수 있습니다

:

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는 "Delete"버튼의 표시 여부를 결정할 때만이 함수를 호출합니다. 목록에서 사용자를 선택하고 한 번에 여러 항목을 제거하면 함수는'obj = None'으로 호출됩니다. 'obj = None' 일 때'False'를 반환하거나'queryset' 함수를 덮어 쓰는 슈퍼 유저를 숨겨서 (Django 1.6의'get_queryset') 목록에서 삭제를 억제 할 수 있습니다. –

+0

그래,이게 내가 한 말이다.) – Simanas

관련 문제