Hi Adam,
I think it's better not to rely on the number of "catch all" urlpatterns to be 1. I suggest it's better to separate AdminSite.get_urls into 3 functions - one returning all urls like before (without the "catch all" urlpattern), one returning a list containing only the "catch all" urlpattern, and one calling both functions and concatenating the lists. This way I will be able to define the first function in my own AdminSite class, add my own urlpatterns and return the list, and Django will do everything else for me. Instead of using urls[:-1] and urls[-1], there should be functions returning these lists, which I will be able to override and add my own urlpatterns. I think this approach is better than relying on the number of "catch all" urlpatterns to be 1.
Also, this feature will break all Django admin sites, unless the name of the function AdminSite.get_urls will remain the same and this function will not change, but the 2 other functions will be new functions and Django will call the third function (with all urls) instead of calling AdminSite.get_urls.