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

Ala*_*air 178 python django django-urls django-4.0

升级到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)
Run Code Online (Sandbox Code Playgroud)

我的urls.py如下:

from django.conf.urls

from myapp.views import home

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

Ala*_*air 279

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

最简单的修复方法是替换url()re_path(). re_path使用诸如 之类的正则表达式url,因此您只需更新导入并替换urlre_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'),
]
Run Code Online (Sandbox Code Playgroud)

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

from django.urls import include, path

from myapp.views import home

urlpatterns = [
    path('', home, name='home'),
    path('myapp/', include('myapp.urls'),
]
Run Code Online (Sandbox Code Playgroud)

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

  • 这非常重要,尤其是因为 Jetbrains 的最新 PyCharm 教程仍然使用 django.conf.urls。特别是对于新手来说,从教程中复制的代码对你来说总是令人不安。 (5认同)
  • @user.dz Django 4.0 [模板](https://github.com/django/django/blob/stable/4.0.x/django/conf/project_template/project_name/urls.py-tpl) 不使用 `网址`。如果您的模板中最终包含“url”,那么您可能安装了早期版本的 Django。运行“which django-admin”或“django-admin --version”可能会帮助您弄清楚发生了什么。使用“python -m django”确保您为虚拟环境使用正确的“django”,例如“python -m django startproject myproject”。 (2认同)

小智 73

我认为解决这个问题的快速方法是执行以下操作;

您可以轻松更换

from django.conf.urls import url
Run Code Online (Sandbox Code Playgroud)

对此:

from django.urls import re_path as url
Run Code Online (Sandbox Code Playgroud)

并使其余代码与以前相同。(感谢@Alasdair)

  • 不要这样做:它不必要地冗长。只需在使用时将 `url()` 更改为 `re_path()` 即可。或者最好还是开始使用 `path()` 作为你的 urlpatterns。 (3认同)
  • 这是修复错误的快速方法。缺点是您的代码最终对于其他 Django 开发人员来说会显得过时,并且会让不知道“url()”是什么的新 Django 开发人员感到困惑。如果您已经掌握了曲调,我建议切换到“re_path”或“path”,如我的回答所示。 (3认同)