Alasdair
Alasdair

Reputation: 308909

ImportError: cannot import name 'url' from 'django.conf.urls' after upgrading to Django 4.0

After upgrading to Django 4.0, I get the following error when running python manage.py runserver

  ...
  File "/path/to/myproject/myproject/urls.py", line 16, in <module>
    from django.conf.urls import url
ImportError: cannot import name 'url' from 'django.conf.urls' (/path/to/my/venv/lib/python3.9/site-packages/django/conf/urls/__init__.py)

My urls.py is as follows:

from django.conf.urls

from myapp.views import home

urlpatterns = [
    url(r'^$', home, name="home"),
    url(r'^myapp/', include('myapp.urls'),
]

Upvotes: 204

Views: 237941

Answers (6)

Eberto Cepero
Eberto Cepero

Reputation: 21

Just do this:

try:
    from django.conf.urls import include, url
except ImportError:
    from django.urls import re_path as url
    from django.urls import include

Upvotes: 0

Code ninja
Code ninja

Reputation: 190

If you are using django-rest-auth or any other package thats causing this error, what you should is to downgrade django.

pip install Django==3.2.19

Upvotes: -6

John Tate
John Tate

Reputation: 772

I saw this thread, and thought this should just be a wrapper. So I asked a researcher friends GPT-4 bot Aria for this by Telegram, and my faithful servant made me a wrapper. Just put it at the top of your urls.py and things start working again.

def url(regex, view, kwargs=None, name=None):
    return re_path(regex, view, kwargs, name)

Solutions above seem plausible but complicated. If you want an easy fix, this is the one. It works and has restored my blog.

Upvotes: -4

Hosein Basafa
Hosein Basafa

Reputation: 1308

I think a quick fix to this problem is to do followings;

You can easily replace

from django.conf.urls import url

to this:

from django.urls import re_path as url

And keep the rest of code to be same as before. (Thanks @Alasdair)

Upvotes: 84

Shah Stavan
Shah Stavan

Reputation: 51

See in django version 4.0 it will not work. So while installing Django in your Virtual Environment select this version

pip install django==3.2.10

This will definitely solve your error and in main urls.py do this:

from django.conf.urls import url

from django.urls import path,include

Upvotes: 1

Alasdair
Alasdair

Reputation: 308909

django.conf.urls.url() was deprecated in Django 3.0, and is removed in Django 4.0+.

The easiest fix is to replace url() with re_path(). re_path uses regexes like url, so you only have to update the import and replace url with re_path.

from django.urls import include, re_path

from myapp.views import home

urlpatterns = [
    re_path(r'^$', home, name='home'),
    re_path(r'^myapp/', include('myapp.urls'),
]

Alternatively, you could switch to using path. path() does not use regexes, so you'll have to update your URL patterns if you switch to path.

from django.urls import include, path

from myapp.views import home

urlpatterns = [
    path('', home, name='home'),
    path('myapp/', include('myapp.urls'),
]

If you have a large project with many URL patterns to update, you may find the django-upgrade library useful to update your urls.py files.

Upvotes: 325

Related Questions