2012-09-18 45 views
5

Tôi có một ứng dụng django mà tôi muốn vô hiệu hóa việc xóa người dùng trong quản trị viên. Tôi đã cố gắng vô hiệu hoá các hành động và thiết lập quyền xóa thành false. Nhưng không ai trong số họ làm việc.Quản trị Django - Vô hiệu hóa xóa người dùng

from django.contrib.auth.models import User 

class UserProfileAdmin(UserAdmin): 
    actions = None 

HOẶC

def has_delete_permission(self, request): 
     return False 

HOẶC

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) 

Nhưng khi tôi đang sử dụng UserAdmin để thêm một nội tuyến để thông tin người dùng, nó đang làm việc tốt. Vì vậy, xin vui lòng đề nghị cho tôi một cách để vô hiệu hóa xóa người dùng trong quản trị django. Cảm ơn trước.

+1

Bạn đang ghi đè 'has_add_permission' để tắt tính năng xóa? Ngoài ra, nó tốt hơn để vô hiệu hóa hành động xóa toàn cầu và rõ ràng thêm vào bất cứ nơi nào nó được yêu cầu – okm

+0

Tôi xin lỗi. Nó thực sự là 'has_delete_permission'. Tôi đã phạm sai lầm ở đây. Và về việc vô hiệu hóa hành động xóa, toàn trang web là một ý tưởng hay. Nhưng khi chúng ta mở một mục người dùng, sẽ có một tùy chọn xóa trong hàng gửi (lưu hàng nút). Làm thế nào để vô hiệu hóa nó? – arulmr

Trả lời

16

Trọng ModelAdmin.has_delete_permission nên làm các trick, chữ ký cách gọi của bạn là không chính xác, nó còn thiếu một obj tham số

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

Hơn nữa, chỉ cần return False ngăn chặn tất cả các nhân viên bao gồm quản trị từ xóa các mục trong Django Quản trị, bạn có thể muốn chỉ cần tinh chỉnh các điều khoản User/Group để ngăn những nhân viên đó mà bạn không muốn họ xóa User(), bằng cách xóa các quyền của họ delete_userprofiledelete_user.

+0

Tôi muốn vô hiệu hóa quyền xóa đối với chính super_user. Ngoài ra 'has_delete_permission' không hiển thị bất kỳ hiệu ứng nào. – arulmr

+0

@arulmr thật lạ lùng, bạn đã đăng ký 'UserProfileAdmin' chính xác chưa và không ghi đè các mẫu Admin? Hãy thử đặt một pdb nhập khẩu; pdb.set_trace() 'trong' has_delete_permission() 'trước mệnh đề' return' để đảm bảo nó được gọi. – okm

+0

tôi đưa ra mã của tôi dưới đây: 'từ django.contrib.auth.models nhập tài từ django.contrib.auth.admin nhập khẩu UserAdmin lớp UserProfileAdmin (UserAdmin): def has_delete_permission (tự, yêu cầu, obj = Không có): nhập pdb; pdb.set_trace(); trả về False admin.site.unregister (Người dùng) admin.site.register (User, UserProfileAdmin) ' Nhưng ** pdb ** không được gọi. Sai lầm ở đây là gì? Tôi nghĩ rằng định dạng mã sẽ không được tốt trong bình luận này. Cảm ơn trước. – arulmr

-2

Nếu mục tiêu của bạn là xóa vĩnh viễn nút "Xóa" khỏi cuối tất cả các biểu mẫu thay đổi quản trị viên, bạn có thể thực hiện việc này bằng cách sửa đổi tệp .../django/contrib/admin/templatetags/admin_modify.py.

Đặc biệt, thay thế các dòng:

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

với:

'show_delete_link': False, 

và không có hình thức thay đổi quản trị sẽ hiển thị nút Delete ở góc dưới bên trái.

+2

Chỉnh sửa các tệp nguồn django sẽ ảnh hưởng đến tất cả các ứng dụng khác. Nhưng tôi muốn đạt được điều này chỉ trong ứng dụng hiện tại của mình. – arulmr

+0

vâng, nếu bạn muốn nâng cấp django của mình thì sao? –

+0

Điểm tốt. Hy vọng câu trả lời của tôi đã bị đánh đến chết. –

Các vấn đề liên quan