Resolving Django URLResolver ImportError

Django is a popular web framework for building web applications in Python. However, when upgrading Django versions, you may encounter an importerror like:

ImportError : No module named django.core.urlresolvers

This can be frustrating at first, but the resolution is relatively straightforward. In this post, we’ll examine the cause of this import error and the steps you need to take to fix it.

The Cause of the ImportError

Prior to Django 1.10, the URL dispatcher lived in django.core.urlresolvers. However, starting with Django 1.10, the URL dispatcher was moved to django.urls.

Therefore, if you are upgrading an older Django project to Django 1.10 or newer, you will need to update your import statements for any files that reference django.core.urlresolvers.

Specifically, you will need to change:

from django.core.urlresolvers import reverse

To:

from django.urls import reverse

Any imports of `django.core.urlresolvers` will result in an ImportError on Django 1.10 and above.

## Updating Your Imports

To fix this, you will need to go through your codebase and update any imports from `django.core.urlresolvers` to use the corresponding modules in `django.urls`.

Here is a mapping of the old urls modules to the new locations:

`django.core.urlresolvers` -> `django.urls`
`django.conf.urls` -> `django.urls.conf`
`django.conf.urls.static` -> `django.urls.static`

So for example:

from django.core.urlresolvers import reverse

Becomes:

from django.urls import reverse

And:

from django.conf.urls import url

Becomes:

from django.urls.conf import url

You will need to update all imports in your views, urls.py files, models, forms, and any other place you reference the URLconf modules.

Other Considerations

In addition to updating imports, there are a few other things to keep in mind when upgrading to Django 1.10 or higher:

  • Update your ROOT_URLCONF setting to point to a module in django.urls rather than django.core.urlresolvers.
  • Update any hardcoded URLs in your code to use reverse() rather than string literals.
  • Read the Django 1.10 release notes closely for any other areas that may need updating.
  • Fully test your application after upgrading to catch any issues early.

Conclusion

While on the surface this seems like a trivial change, upgrading Django can introduce subtler issues if the proper steps aren’t taken. By methodically updating your imports and URLs, you can ensure a smooth transition to a newer Django version.

The key is identifying anywhere your code references the old django.core.urlresolvers module and updating it to use the new django.urls module. With some find-and-replace commands and thorough testing, you’ll be running on Django 1.10 or higher in no time!