ImportError:升级到 Django 4.0 后无法从“django.conf.urls”导入名称“url”

Posted

技术标签:

【中文标题】ImportError:升级到 Django 4.0 后无法从“django.conf.urls”导入名称“url”【英文标题】:ImportError: cannot import name 'url' from 'django.conf.urls' after upgrading to Django 4.0 【发布时间】:2022-01-16 00:53:18 【问题描述】:

升级到Django 4.0后,运行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)

我的urls.py如下:

from django.conf.urls

from myapp.views import home

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

【问题讨论】:

【参考方案1】:

django.conf.urls.url() 在 Django 3.0 中被弃用,并在 Django 4.0+ 中被删除。

最简单的解决方法是将url() 替换为re_path()re_path 使用像url 这样的正则表达式,因此您只需更新导入并将url 替换为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'),
]

或者,您可以切换到使用pathpath() 不使用正则表达式,因此如果您切换到路径,则必须更新您的 URL 模式。

from django.urls import include, path

from myapp.views import home

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

如果您有一个需要更新许多 URL 模式的大型项目,您可能会发现 django-upgrade 库对更新您的 urls.py 文件很有用。

【讨论】:

这非常重要,尤其是因为 Jetbrains 的最新 PyCharm 教程仍然使用 django.conf.urls。尤其是对于新手来说,从教程中复制代码总是令人不安。 谢谢,但我还不知道为什么我在安装 django4 时从初始模板中得到 url @user.dz Django 4.0 template 不使用url。如果您最终在模板中使用url,那么您可能安装了较早版本的 Django。运行 which django-admindjango-admin --version 可能会帮助您弄清楚发生了什么。使用python -m django 确保您为虚拟环境使用正确的django,例如python -m django startproject myproject. 你说得对,我很惊讶在虚拟环境中看到django-admin 1.11 版。我为房子打扫和清理,发现:/usr/local 中的 python 2.7、3.6、3.7、3.8、3.9、3.10 和Library(macos)中的另一个 python。我的安装在Library 并以某种方式链接到/opt,它具有优先权。我删除它并使用正确的模板从头开始。【参考方案2】:

查看 django 版本 4.0 它将无法正常工作。 所以在你的虚拟环境中安装 Django 时选择这个版本

pip install django==3.2.10

这肯定会解决你的错误,在 ma​​in urls.py 中这样做:

从 django.conf.urls 导入网址

从 django.urls 导入路径,包括

【讨论】:

降级到 Django 3 是一个临时修复。在某些时候用户应该升级到 Django 4 或更高版本,此时您需要替换 url()s

以上是关于ImportError:升级到 Django 4.0 后无法从“django.conf.urls”导入名称“url”的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:无法在 django virtualenv 中导入名称 _remove_dead_weakref

Heroku 上的 Django 部署,升级到 Cedar-14,导入设置错误

升级到 Django 1.7。导入错误:没有名为仪表板的模块

Python3.7 ImportError:没有名为“django”的模块

Django 1.8:抛出 ImportError:没有名为“MySQLdb”的模块

ImportError: No module named django