I believe the correct way of doing it, is subclassing ChangeList and override the url_for_result method to create the correct change url you want.
Override the get_changelist in the admin.ModelAdmin subclass to return the new class:
from django.contrib.admin.views.main import ChangeList
from django.contrib.admin.util import quote
class FooChangeList(ChangeList):
def url_for_result(self, result):
pk = getattr(result, self.pk_attname)
return '/foos/foo/%d/' % (quote(pk))
class FooAdmin(admin.ModelAdmin):
def get_changelist(self, request, **kwargs):
return FooChangeList