Django4.0使用过程遇到一些问题的解决办法
- 升级到 Django 4.0 后,运行时出现以下错误
python manage.py runserver
...File "/path/to/myproject/myproject/urls.py", line 16, in <module>from django.conf.urls import urlImportError: cannot import name 'url' from 'django.conf.urls' (/path/to/my/venv/lib/python3.9/site-packages/django/conf/urls/__init__.py)
django.conf.urls.url()在 Django 3.0 中已弃用,并在 Django 4.0+ 中删除。
urls.py
from django.conf.urlsfrom myapp.views import indexurlpatterns = [url(r'^$', home, name="index"),url(r'^myapp/', include('myapp.urls'),]
最简单的解决方法是替换url()为re_path()。re_path使用正则表达式url,只需更新导入并替换url为re_path。例如:
from django.urls import include, re_pathfrom myapp.views import indexurlpatterns = [re_path(r'^$', home, name='index'),re_path(r'^myapp/', include('myapp.urls'),]
或者可以切换到使用path.path(),不使用正则表达式,如果切换到路径则必须更新 URL 模式。
from django.urls import include, pathfrom myapp.views import indexurlpatterns = [path('', home, name='index'),path('myapp/', include('myapp.urls'),]
如果有一个需要更新许多URL模式的大型项目,django-upgrade库对更新urls.py文件很有用。
github:https://github.com/adamchainz/django-upgrade
2.Django4.0 ImportError:无法从“django.utils.translation”导入名称“ugettext_lazy”
Django4.0,尝试导入时ugettexget_lazy,如下面的代码所示
from django.utils.translation import ugettexget_lazy as _
收到以下错误:
ImportError: cannot import name 'ugettext_lazy' from 'django.utils.translation'
ugettexget_lazy已从 Django 4 中删除,请改用它
from django.utils.translation import gettext_lazy as _
3.无法从 django.utils.http 导入 is_safe_url ,替代方案?
在Django3.0中,is_safe_url已重命名为url_has_alowed_host_and_scheme
4.在django中区分null = True,blank = True
null=True在数据库中的列上设置NULL(对比NOT NULL).Django字段类型的空值,例如DateTimeField或ForeignKey将存储NULL在DB中.
blank=True确定表单中是否需要该字段.这包括管理员和您自己的自定义表单.如果blank=True那时不需要该字段,而如果False该字段不能为空.
两者的组合是如此频繁,因为通常如果您要在表单中允许字段为空,那么您还需要您的数据库来允许NULL该字段的值.例外是CharFields和TextFields,它们在Django中永远不会保存为NULL.空值作为空字符串('')存储在DB中.
5.django恢复上次迁移
可以通过迁移到先前的迁移来恢复.
例如,您的最后两次迁移是:
0006_previous_migration0007_migration_to_revert
然后你会做:
python manage.py migrate my_app 0007_previous_migration
然后,可以删除迁移0008_migration_to_revert.
要撤消应用的所有迁移,可以运行:
python manage.py migrate my_app zero
6.django.db.utils.OperationalError: 1366
django.db.utils.OperationalError: (1366, "Incorrect string value: '\\xE4\\xB8\\xBB\\xE6\\x9C\\xBA...' for column 'property_display' at row 1")
这个错误通常是在使用Django ORM时由于MySQL数据库编码不兼容导致的。常见的编码不兼容问题是MySQL使用默认的“utf8”编码而Django使用“utf8mb4”编码。在Django的数据库设置中修改字符集编码为“utf8mb4”也可以在MySQL的配置文件中指定使用该编码。例如:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'mydatabase','USER': 'mydatabaseuser','PASSWORD': 'mypassword','HOST': 'localhost','PORT': '3306','OPTIONS': {'charset': 'utf8mb4',},}}




