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!