Невелика замітка про те, як виправити queryset формі адміністрування admin.ModelAdmin або UserAdmin . Власне різниці ніякої, оскільки форма UserAdmin успадкованою від admin.ModelAdmin . Але тим не менше покажу на прикладі UserAdmin .
Завдання наступна. На сайті є суперкористувачі і користувачі з адміністрації. Суперкористувачі можуть бачити всіх користувачів і редагувати як завгодно. А користувачі адміністрації можуть бачити всі призначені для користувача записи крім суперкористувача, а також не можуть призначати інших користувачів суперкористувачем.
А тепер до вирішення. Виглядати дана форма буде наступним чином.
- # -*- coding: utf-8 -*-
- from django.contrib.auth.admin import UserAdmin
- class EUserAdmin(UserAdmin):
- def get_readonly_fields(self, request, obj=None):
- # Робимо поле Нередагована, якщо користувач не є суперкористувачем
- return super().get_readonly_fields(request) if request.user.is_superuser else ('is_superuser',)
- def get_queryset(self, request):
- qs = super().get_queryset(request)
- # а також виключаємо з queryset всіх суперкористувачем, якщо користувач не є суперепользователем
- return qs if request.user.is_superuser else qs.exclude(is_superuser=True)
Подібні обмеження корисні, якщо потрібно захистити суперкористувача від редагування звичайними користувачами з адміністрації.