2012-09-18 4 views
5

У меня есть приложение django, в котором я хочу отключить удаление пользователя в admin. Я попытался отключить действия и установить разрешение удаления на false. Но никто из них не работал.Django admin - Отключить удаление пользователя

from django.contrib.auth.models import User 

class UserProfileAdmin(UserAdmin): 
    actions = None 

ИЛИ

def has_delete_permission(self, request): 
     return False 

ИЛИ

def get_actions(self, request): 
     actions = super(UserProfileAdmin, self).get_actions(request) 
     if 'delete_selected' in actions: 
      del actions['delete_selected'] 
     return actions 

admin.site.unregister(User) 
admin.site.register(User, UserProfileAdmin) 

Но когда я использую UserAdmin добавить инлайн к информации пользователя, она работает нормально. Поэтому, пожалуйста, предложите мне отключить удаление пользователя в администраторе django. Заранее спасибо.

+1

Вы нарушаете 'has_add_permission', чтобы отключить удаление? Кроме того, лучше отключить действие удаления во всем мире и явно добавить туда, где это необходимо – okm

+0

Прошу прощения. Это фактически 'has_delete_permission'. Я сделал ошибку здесь. И об отключении действия удаления, общесистемный подход - хорошая идея. Но когда мы открываем запись пользователя, в строке отправки будет выбрана опция удаления (строка кнопки сохранения). Как отключить его? – arulmr

ответ

16

Переопределение ModelAdmin.has_delete_permission должен сделать трюк, ваше применение подпись неверна, она отсутствует в obj параметр

class UserProfileAdmin(UserAdmin): 
    def has_delete_permission(self, request, obj=None): # note the obj=None 
     return False 

Кроме того, просто return False предотвращает все штаты, включая администратора от удаления элементов в Django администратора, вы можете захотеть просто настройте User/Group разрешения на предотвращение тех сотрудников, которых вы не хотите, чтобы они удалили User(), удалив их разрешения delete_userprofile и delete_user.

+0

Я хочу отключить разрешение на удаление для самого super_user. Также 'has_delete_permission' не показывал никакого эффекта. – arulmr

+0

@arulmr Странно, вы зарегистрировали 'UserProfileAdmin' правильно и нет переопределения шаблонов Admin? Попробуйте поставить 'import pdb; pdb.set_trace() 'в' has_delete_permission() 'перед предложением' return', чтобы гарантировать, что он будет вызван. – okm

+0

Я даю мой код ниже: 'от django.contrib.auth.models импорта пользователя из django.contrib.auth.admin импорта UserAdmin класс UserProfileAdmin (UserAdmin): Защиту has_delete_permission (я, запрос, OBJ = Нет): import pdb; pdb.set_trace(); return False admin.site.unregister (Пользователь) admin.site.register (User, UserProfileAdmin) ' Но ** pdb ** не был вызван. Какая ошибка здесь? Я думаю, что формат кода не будет хорош в этом комментарии. Заранее спасибо. – arulmr

-2

Если ваша цель - навсегда удалить кнопку «Удалить» из нижней части всех форм изменения администратора, вы можете сделать это, изменив файл .../django/contrib/admin/templatetags/admin_modify.py.

В частности, заменить строки:

'show_delete_link': (not is_popup and context['has_delete_permission'] 
          and (change or context['show_delete'])), 

с:

'show_delete_link': False, 

и никаких форм изменений администратора должны показать кнопку Delete в нижнем левом углу.

+2

Редактирование исходных файлов django повлияет на все другие приложения. Но я хочу достичь этого только в моем текущем приложении. – arulmr

+0

да, что, если вы хотите обновить свой джанго? –

+0

Хорошие баллы. Надеюсь, мой ответ был избит до смерти. –

Смежные вопросы