我一直在开发学校应用程序,以允许校长和他的老师分析数据。该原理需要将自己的人员添加到系统中。我认为使用Django的管理面板将是一个很好的选择。
在这里,我是超级用户,委托人是工作人员(可以在管理面板上管理事情的人)。
作为超级用户,我可以看到以下输出:
这是工作人员的看法:
校长(工作人员用户)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身份登录时,他应该只看到自己(以及以后的其他小组成员),因为他仅属于“两个学校”。
如果能对此有所帮助,我将感到很高兴。
答案 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())