Django "list_filter" Based On The Admin Queryset
I am developing an application which has both admins and sub-admins. Sub-admins are created based on the group they belong to. So a sub-admin can see only data which is related to
Solution 1:
Don't change your VideoDetailsAdmin
, only use a custom list filter:
class VideoDetailsAdmin(ModelAdmin):
list_filter = UserFilterList # that's the only line to change
def get_visible_users(self, request): # small refactor to re-use in filter
query_set = Group.objects.filter(user=request.user)
group_list = []
for g in query_set:
group_list.append(g.name)
# To get all users associated in those groups
return User.objects.filter(groups__name__in=group_list)
def get_queryset(self, request):
users = self.get_visible_users(request)
# Override the get_queryset method for Admin
qs = super(VideoDetailsAdmin, self).get_queryset(request)
if not request.user.is_superuser:
return qs.filter(user__in=users)
else:
return qs
class UserFilterList(SimpleListFilter):
def lookups(self, request, model_admin):
visible_users = model_admin.get_visible_users(request)
return ((user.pk, user.username) for user in visible_users)
def queryset(self, request, queryset):
return queryset.filter(user_id=self.value()) if self.value() else queryset
Post a Comment for "Django "list_filter" Based On The Admin Queryset"