Django-grappelli admin: No reverse match error

heavilyinvolved picture heavilyinvolved · Aug 24, 2011 · Viewed 8.5k times · Source

I've been working on a django project for a while now that uses grappelli for the admin and all of a sudden today my change_form.html template is throwing the following error:

Caught NoReverseMatch while rendering: Reverse for "grp_related_lookup" with arguments '()' and keyword arguments '{}' not found.

The offending line of code is line 38:

37    $.each(related_lookup_fields_fk, function() {
38        $("#id_" + this).grp_related_fk({lookup_url:"{% url grp_related_lookup %}"});
39    });

which is preceded by this bit of code:

var related_lookup_fields_fk = {% get_related_lookup_fields_fk adminform.model_admin %};

Obviously it's the {% url grp_related_lookup %} bit that's causing the problem.

I don't understand how the template is resolving grp_related_lookup to grappelli.views.related.related_lookup. I have tried replacing grp_related_lookup with grappelli.views.related.related_lookup and that didn't work either. Also, in the template the offending line looks like this:

$("#id_" + this).grp_related_fk({lookup_url:"{% url grp_related_lookup %}"});

but in the error message it looks like this:

$("#id_" + this).grp_related_fk({lookup_url:"{% url 'grp_related_lookup' %}"});

I don't know if the single quotes surrounding grp_related_lookup might have something to do with the problem or not. Is that how django rendered the function call? Is it passing the string 'grp_related_lookup' to the url template tag? If so, what might have caused this to break suddenly?

Some additional info:

  • The value of related_lookup_fields is an empty list []. I am not defining any related_lookup_fields in my admin.py.
  • I threw a couple debug statements into the grappelli.views.related.related_lookup view function and it doesn't appear to be getting called.
  • I have not touched any of the templates recently.

Hopefully someone can point me in the right direction... Thanks!

Answer

brutasse picture brutasse · Aug 24, 2011

Do you still have 'grappelli.urls' included in your URLconf? That the only reason I see that would cause this error. You can try using python manage.py shell:

from django.core.urlresolvers import reverse
print reverse('grp_related_lookup')

If this line returns the correct URL, you shouldn't get a NoReverseMatch in your template.

The quotes around grp_related_lookup shouldn't be a concern. The {% url %} tag accepts both quoted and unquoted strings as first argument, so django normalizes it to quoted strings. This behaviour is going to change in the future: you'll be able to pass template variables to {% url %} using unquoted strings. {% url foo %} and {% url "foo" %} won't give the same result, see the 1.3 release notes for details about this.