Reputation: 308909
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
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
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
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
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
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
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