Skip to content Skip to sidebar Skip to footer

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"