如何在Django管理界面中仅显示组成员

时间:2018-10-14 21:36:33

标签: python django django-models django-admin

我一直在开发学校应用程序,以允许校长和他的老师分析数据。该原理需要将自己的人员添加到系统中。我认为使用Django的管理面板将是一个很好的选择。

在这里,我是超级用户,委托人是工作人员(可以在管理面板上管理事情的人)。

作为超级用户,我可以看到以下输出:

enter image description here

这是工作人员的看法:

enter image description here

我在系统中也有两个小组(学校一,学校二): enter image description here

校长(工作人员用户)John Doe属于“学校二”组,该组具有添加/更改/删除/查看用户的权限。

我的问题是我如何列出员工的用户以仅查看其人员? (没有超级用户,也没有其他组的人员)。

让我分享为该自定义用户admin视图实现的一些源代码:

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。同样,如何显示属于某个组的用户?例如,在这种情况下,当John Doe(工作人员)以admin身份登录时,他应该只看到自己(以及以后的其他小组成员),因为他仅属于“两个学校”。

如果能对此有所帮助,我将感到很高兴。

1 个答案:

答案 0 :(得分:1)

您可以像这样为管理员类覆盖get_queryset方法;

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