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'>)