Как отображать только членов группы в интерфейсе администратора Django - PullRequest
0 голосов
/ 15 октября 2018

Я разрабатывал школьное приложение, позволяющее директору и его учителям анализировать данные.Принцип должен добавить своих людей в систему.Я думаю, что использование админ-панели Django было бы действительно хорошим выбором для этого.

Здесь я являюсь суперпользователем, а руководитель - персонал (который может управлять вещами в админ-панели).

Каксуперпользователь, я вижу следующий вывод:

enter image description here

А вот мнение персонала:

enter image description here

У меня также есть две группы (одна школа, вторая школа) в системе: enter image description here

Директор (штатный сотрудник) Джон Доупринадлежит к группе «Школа два», которая имеет права добавлять / изменять / удалять / просматривать пользователей.

Мой вопрос: как я могу перечислить пользователей для персонала, который может видеть только его группу людей?(нет суперпользователя и людей других групп).

Позвольте мне поделиться некоторым исходным кодом, который я реализовал для этого пользовательского представления администратора:

Файл forms.py:

class UserAdminCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        User = get_user_model()
        model = User
        fields = ('email',)

    def clean_password2(self):
        # Check that the two password entries match
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        # Save the provided password in hashed format
        user = super(UserAdminCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        user.is_staff = True
        if commit:
            user.save()
        return user

class UserAdminChangeForm(forms.ModelForm):

      password = ReadOnlyPasswordHashField()

      class Meta:
         User = get_user_model()
         model = User
         fields = '__all__' #fields = ('email', 'password', 'is_active','is_staff', 'groups')

       def __init__(self, *args, **kwargs):
           super(UserAdminChangeForm, self).__init__(*args, **kwargs)
           f = self.fields.get('user_permissions', None)
           if f is not None:
              f.queryset = f.queryset.select_related('content_type')

       def clean_password(self):
              return self.initial["password"]

Вот файл admin.py

from django.contrib import admin
from .models import User
from .forms import UserAdminCreationForm, UserAdminChangeForm

class MyUserAdmin(admin.ModelAdmin):
      form = UserAdminChangeForm
      add_form = UserAdminCreationForm

      list_display = ('email', 'first_name', 'last_name', 'is_staff', 'is_active', 'is_email_verified')
      list_filter = ('is_staff', 'is_active', 'groups')
      readonly_fields = ('last_login', 'date_joined',)
      fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Personal info', {'fields': ('first_name','last_name')}),
        ('Permissions', {'fields': ('is_active','is_staff', 'groups')}),
        ('Important dates', {'fields': ('last_login', 'date_joined')}),
    )
       add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('first_name','last_name','email', 'password1', 'password2')}
         ),
    )
       search_fields = ('first_name', 'last_name', 'email',)
       ordering = ('email',)
       filter_horizontal = ()

admin.site.register(User, MyUserAdmin)

Я использую Django 2.1.Опять же, как я могу отобразить пользователей, которые принадлежат к определенной группе?Например, здесь, в этом случае, когда Джон Доу (сотрудники) вошел в систему как администратор, он должен видеть себя (и будущих членов группы) только потому, что он принадлежит только к «Школе второй».

Буду рад, если смогу помочь с этим.

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете переопределить метод get_queryset для класса admin следующим образом:

class MyUserAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        # Filter here by user group
        return qs.filter(groups__id__in=request.user.groups.all())

Документы для этого здесь;https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_queryset

...