On this line in the template:
{% url object|smart_admin_urlname:'change' object.pk %}
I got:
Exception Value: Reverse for 'exercises_exercise_change' with arguments '(3,)' and keyword arguments '{}' not found. 0 pattern(s) tried: []
exercises/admin.py
from django.contrib.admin import site, ModelAdmin
class ExerciseAdmin(ModelAdmin):
    actions = ['apply_tag', 'show', 'hide']
    list_filter = ['exercise_set', 'visible', 'exercise_set']
    list_display = ['short_title', 'visible', 'exercise_set']
    # ommited custom functions and irrelavent parameters
class PythonExerciseAdmin(ExerciseAdmin):
    form = PythonExerciseAdminForm
class SqlExerciseAdmin(ExerciseAdmin):
    form = SqlExerciseAdminForm
site.register(PythonExercise, PythonExerciseAdmin)
site.register(SqlExercise, SqlExerciseAdmin)
The working url in administration site should look like:
http://127.0.0.1/admin/exercises/pythonexercise/3/ http://127.0.0.1/admin/exercises/sqlexercise/4/
I'm not sure where to look, or change to fix this bug.
Thank you @Sandeep Balagopal! 
Why didn't I think of grep -rl "smart_admin_urlname" . silly me.
common/templatetags/common_tags.py
@register.filter
def smart_admin_urlname(obj, view_name):
    return u'admin:{0}_{1}_{2}'.format(obj._meta.app_label,
                                       obj._meta.model_name, view_name)
exercises/models.py
class Exercise(Model):
    # ommited custom parameters and functions
class PythonExercise(Exercise):
    exercise_type = Constant.PYTHON
    # ommited custom parameters 
class SqlExercise(Exercise):
    exercise_type = Constant.SQL
Adding the following line fixed the link, but this is not what I want to do...it makes the admin site show the Exercise class.
site.register(Exercise, ExerciseAdmin)
Tried, but did not make any difference:
exercises/forms.py
def get_admin_form(exercise_model=PythonExercise,exercise_type=Constant.PYTHON):
    class ExerciseAdminForm(ModelForm):
        class Meta:
            model = exercise_model
            fields = '__all__'
        def __init__(self, *args,**kwargs):
            super(ExerciseAdminForm, self).__init__(*args,**kwargs)
            self.fields['starter_code'].widget = _make_language_mode(exercise_type=exercise_type)
            if exercise_type == Constant.PYTHON:
                # omitted
    print('DEBUG:model = ',ExerciseAdminForm.__dict__['_meta'].__dict__['model'] )               
    return ExerciseAdminForm
Debug message shows:
('DEBUG:model = ', <class 'exercises.models.PythonExercise'>)
('DEBUG:model = ', <class 'exercises.models.SqlExercise'>)
