chúng có khả năng đặt cờ is_superuser trên bất kỳ tài khoản nào, kể cả của riêng chúng. (!!!)
Không chỉ này, họ cũng đạt được khả năng cung cấp cho mình bất kỳ điều khoản một-by-one, cùng hiệu ứng ...
tôi chắc chắn rằng nó liên quan đến subclassing django .contrib.auth.forms.UserChangeForm
Vâng, không nhất thiết. Biểu mẫu bạn thấy trong trang thay đổi của quản trị viên django được tạo động bởi ứng dụng quản trị và dựa trên UserChangeForm
, nhưng lớp này hầu như không thêm xác thực regex vào trường username
.
và hooking nó vào đối tượng UserAdmin đã tùy chỉnh của tôi ...
Một tùy chỉnh UserAdmin
là con đường để đi đây. Về cơ bản, bạn muốn thay đổi thuộc tính fieldsets
thành một cái gì đó như thế:
class MyUserAdmin(UserAdmin):
fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
# Removing the permission part
# (_('Permissions'), {'fields': ('is_staff', 'is_active', 'is_superuser', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
# Keeping the group parts? Ok, but they shouldn't be able to define
# their own groups, up to you...
(_('Groups'), {'fields': ('groups',)}),
)
Nhưng vấn đề ở đây là hạn chế này sẽ áp dụng cho tất cả người dùng. Nếu đây không phải là những gì bạn muốn, bạn có thể ghi đè ví dụ change_view
để hoạt động khác nhau tùy thuộc vào sự cho phép của người dùng. Đoạn mã:
class MyUserAdmin(UserAdmin):
staff_fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
# No permissions
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
(_('Groups'), {'fields': ('groups',)}),
)
def change_view(self, request, *args, **kwargs):
# for non-superuser
if not request.user.is_superuser:
try:
self.fieldsets = self.staff_fieldsets
response = super(MyUserAdmin, self).change_view(request, *args, **kwargs)
finally:
# Reset fieldsets to its original value
self.fieldsets = UserAdmin.fieldsets
return response
else:
return super(MyUserAdmin, self).change_view(request, *args, **kwargs)
Điều đó đã làm các trick . Cảm ơn câu trả lời kỹ lưỡng như vậy! –
Vì tôi đang sử dụng Groups để quản lý quyền, tôi cũng đã xóa phần Nhóm khỏi 'staff_fieldsets'. –
Cảm ơn! Điều này đã giúp tôi rất nhiều! Tuy nhiên, Django 1.1.2 dường như không thích '_' bạn có trước Thông tin cá nhân và phần còn lại. – Tyug